diff --git a/package.json b/package.json index 4210e1f54..c7a5fc50c 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,8 @@ "check:rollback-inventory": "node refactor/scripts/rollback-inventory.mjs --check", "test:rollback:pages": "node scripts/pages-recovery.mjs", "test:rollback:pages:browser": "node test/pages-recovery-browser.mjs", - "test:bun-install": "node refactor/scripts/bun-evaluation.mjs" + "test:bun-install": "node refactor/scripts/bun-evaluation.mjs", + "test:chapter-native": "playwright test --config playwright.chapter-native.config.js" }, "browserslist": "last 1 Chrome version", "devDependencies": { diff --git a/packages/artplayer-plugin-chapter/ARCHITECTURE.md b/packages/artplayer-plugin-chapter/ARCHITECTURE.md index 3a54b7132..5a204b68c 100644 --- a/packages/artplayer-plugin-chapter/ARCHITECTURE.md +++ b/packages/artplayer-plugin-chapter/ARCHITECTURE.md @@ -112,3 +112,13 @@ Animation after entering real fullscreen. It preserves title/opacity/hit-test assertions and uses actual installed artifacts in the installed browser scope. `ARTPLAYER_CHAPTER_HOVER_BASELINE=1` restores the old immediate coordinate read for diagnosis only. This helper corrects test synchronization, not player behavior. + +For CHAPTER-TIMING-01, ARTPLAYER_CHAPTER_TIMING_DIAGNOSTICS=1 adds a bounded native +property/event/heartbeat recorder to the combination suite. The default suite is +unchanged. `yarn test:chapter-native` runs a separate page with no ArtPlayer script +to compare metadata restoration and one direct/deferred native correction. +The unassisted Windows WebKit control currently fails its position assertion; +these diagnostic cases are not ordinary CI source tests. Native five-second gaps +remain even with deferred correction, so no timer workaround is in production. +See refactor/changes/2026-09-15-PKG-CHAPTER-05-native-timing.md for exact commands, +retained failures, measured boundaries and the still-open device/release gates. diff --git a/playwright.chapter-native.config.js b/playwright.chapter-native.config.js new file mode 100644 index 000000000..70f841fe3 --- /dev/null +++ b/playwright.chapter-native.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from '@playwright/test' +import base from './playwright.config.js' + +export default defineConfig(base, { + testMatch: '**/chapter-native-media.native.js', + outputDir: 'refactor/.cache/chapter-native/results', + reporter: [['list'], ['json', { outputFile: 'refactor/.cache/chapter-native/report.json' }]], +}) diff --git a/refactor/baselines/chapter-native-timing-validation.json b/refactor/baselines/chapter-native-timing-validation.json new file mode 100644 index 000000000..45ddb455b --- /dev/null +++ b/refactor/baselines/chapter-native-timing-validation.json @@ -0,0 +1,7899 @@ +{ + "task": "PKG-CHAPTER-05", + "status": "doing", + "capturedAt": "2026-09-14T17:48:16.211Z", + "sourceHead": "a03e5acc500ceee13f79f438bd0533995f883eaa", + "node": "24.21.0", + "yarn": "1.22.22", + "platform": "win32", + "productionChanges": false, + "installedMap": { + "path": "refactor/.cache/packages/run-s8MkZT/browser-artifacts.json", + "sha256": "176de3eeff7b9d8ad67b4257fc1745b1ce1674ecda350cc3ba088a9b746df86b" + }, + "runs": [ + { + "label": "access", + "scope": "installed combinations; diagnostics on; default retain-on-failure trace; repeat-each 3", + "directory": "refactor/.cache/chapter05-native-access-report", + "report": { + "path": "refactor/.cache/chapter05-native-access-report/report.json", + "sha256": "737e498460cd79b5677f5dd495cc16a826659c0250b3ff5927f596a489910594" + }, + "stats": { + "startTime": "2026-09-14T17:35:19.096Z", + "duration": 61901.74600000001, + "expected": 11, + "skipped": 0, + "unexpected": 1, + "flaky": 0 + }, + "exitCode": 1, + "log": { + "path": "refactor/.cache/chapter05-native-access.log", + "sha256": "c70700fa0ed40cd6a1c48bed96c7f7be87bc8735eee9537067e6730f79633143" + }, + "samples": [ + { + "ordinal": 1, + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:20.579Z", + "status": "passed", + "recordCount": 564, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1052 + }, + { + "name": "pause", + "at": 1789 + }, + { + "name": "seeking", + "at": 2605 + }, + { + "name": "canplay", + "at": 2605 + }, + { + "name": "seeked", + "at": 2622 + }, + { + "name": "loadstart", + "at": 3681 + }, + { + "name": "loadedmetadata", + "at": 3978 + }, + { + "name": "loadeddata", + "at": 3978 + }, + { + "name": "canplay", + "at": 3979 + }, + { + "name": "seeking", + "at": 4009 + }, + { + "name": "seeked", + "at": 4026 + }, + { + "name": "canplay", + "at": 4026 + }, + { + "name": "playing", + "at": 6546 + } + ], + "publicState": { + "at": 6682, + "timeOrigin": 1789407320892, + "qualitySelectedAt": 3380, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2578 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3978 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 656, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 656, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 656, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1052, + "time": 0.0014167, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1789, + "time": 0.5363296, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2605, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2605, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2622, + "time": 3.0075392, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3978, + "time": 3.0075392, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3978, + "time": 3.0075392, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3979, + "time": 3.0075392, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 4009, + "time": 3.0075392, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 4025, + "time": 0.001313, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4026, + "time": 0.001313, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6546, + "time": 3.0115272, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.1466653, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 2, + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:20.579Z", + "status": "passed", + "recordCount": 450, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1066 + }, + { + "name": "pause", + "at": 1724 + }, + { + "name": "seeking", + "at": 2526 + }, + { + "name": "canplay", + "at": 2526 + }, + { + "name": "seeked", + "at": 2541 + }, + { + "name": "loadstart", + "at": 3860 + }, + { + "name": "loadedmetadata", + "at": 3930 + }, + { + "name": "loadeddata", + "at": 3930 + }, + { + "name": "canplay", + "at": 3931 + }, + { + "name": "seeking", + "at": 3960 + }, + { + "name": "seeked", + "at": 3976 + }, + { + "name": "canplay", + "at": 3976 + }, + { + "name": "playing", + "at": 6345 + } + ], + "publicState": { + "at": 6481, + "timeOrigin": 1789407320894, + "qualitySelectedAt": 3318, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2497 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3930 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 653, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 653, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 653, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1066, + "time": 0.0044309, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1724, + "time": 0.5416264, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2526, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2526, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2541, + "time": 3.0072655, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3930, + "time": 3.0072655, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3930, + "time": 3.0072655, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3931, + "time": 3.0072655, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3960, + "time": 3.0072655, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3976, + "time": 0.0022271, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3976, + "time": 0.0022271, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6345, + "time": 3.0105105, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.1462509, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 3, + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:27.667Z", + "status": "passed", + "recordCount": 840, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 9201, + "gap": 5061 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 988 + }, + { + "name": "pause", + "at": 1739 + }, + { + "name": "seeking", + "at": 2672 + }, + { + "name": "canplay", + "at": 2673 + }, + { + "name": "seeked", + "at": 2689 + }, + { + "name": "loadstart", + "at": 3798 + }, + { + "name": "loadedmetadata", + "at": 4126 + }, + { + "name": "loadeddata", + "at": 4127 + }, + { + "name": "canplay", + "at": 4127 + }, + { + "name": "seeking", + "at": 4156 + }, + { + "name": "seeked", + "at": 4175 + }, + { + "name": "canplay", + "at": 4175 + }, + { + "name": "seeking", + "at": 9197 + }, + { + "name": "seeked", + "at": 9200 + }, + { + "name": "playing", + "at": 11580 + } + ], + "publicState": { + "at": 12115, + "timeOrigin": 1789407327882, + "qualitySelectedAt": 3478, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2653 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 4127 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 601, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 601, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 602, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 988, + "time": 0.0014276, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1739, + "time": 0.5639905, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2672, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2673, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2689, + "time": 3.0077751, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 4126, + "time": 3.0077751, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 4127, + "time": 3.0077751, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4127, + "time": 3.0077751, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 4156, + "time": 3.0077751, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 4175, + "time": 3.0077751, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4175, + "time": 3.0077751, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 9197, + "time": 3.0098934, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 9200, + "time": 3.0098934, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 11580, + "time": 3.015103, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.5497873, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 4, + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:27.855Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected - 3\u001b[39m\n\u001b[31m+ Received + 1\u001b[39m\n\n\u001b[32m- Array [\u001b[39m\n\u001b[32m- \"/test/pattern.mp4?quality=A\",\u001b[39m\n\u001b[32m- ]\u001b[39m\n\u001b[31m+ Array []\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate", + "recordCount": 540, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 9047, + "gap": 5036 + }, + { + "at": 14047, + "gap": 5000 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1085 + }, + { + "name": "pause", + "at": 1547 + }, + { + "name": "seeking", + "at": 2449 + }, + { + "name": "canplay", + "at": 2449 + }, + { + "name": "seeked", + "at": 2464 + }, + { + "name": "loadstart", + "at": 3669 + }, + { + "name": "loadedmetadata", + "at": 3982 + }, + { + "name": "loadeddata", + "at": 3982 + }, + { + "name": "canplay", + "at": 3983 + }, + { + "name": "seeking", + "at": 4011 + }, + { + "name": "seeked", + "at": 4027 + }, + { + "name": "canplay", + "at": 4027 + }, + { + "name": "seeking", + "at": 14046 + }, + { + "name": "canplay", + "at": 14058 + }, + { + "name": "seeked", + "at": 14075 + } + ], + "publicState": { + "at": 14325, + "timeOrigin": 1789407328073, + "qualitySelectedAt": 3353, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2431 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3982 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 565, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 565, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 565, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1085, + "time": 0.0075905, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1547, + "time": 0.4529973, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2449, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2449, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2464, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3982, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3982, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3983, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 4011, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 4027, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4027, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 14046, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "canplay", + "at": 14058, + "time": 3.0084509, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 14075, + "time": 3.0105204, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + } + ], + "time": 3.0105204, + "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" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 5, + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:40.767Z", + "status": "passed", + "recordCount": 550, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 983 + }, + { + "name": "pause", + "at": 1676 + }, + { + "name": "seeking", + "at": 2462 + }, + { + "name": "canplay", + "at": 2462 + }, + { + "name": "seeked", + "at": 2479 + }, + { + "name": "loadstart", + "at": 3515 + }, + { + "name": "loadedmetadata", + "at": 3795 + }, + { + "name": "loadeddata", + "at": 3795 + }, + { + "name": "canplay", + "at": 3796 + }, + { + "name": "seeking", + "at": 3825 + }, + { + "name": "seeked", + "at": 3827 + }, + { + "name": "canplay", + "at": 3828 + }, + { + "name": "playing", + "at": 6272 + } + ], + "publicState": { + "at": 6414, + "timeOrigin": 1789407340997, + "qualitySelectedAt": 3170, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2437 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3795 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 526, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 526, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 526, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 983, + "time": 0.0059518, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1676, + "time": 0.5431023, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2462, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2462, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2479, + "time": 3.0080717, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3795, + "time": 3.0080717, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3795, + "time": 3.0080717, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3796, + "time": 3.0080717, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3825, + "time": 0.0011259, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3827, + "time": 0.0011259, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3828, + "time": 0.0011259, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6272, + "time": 3.0164861, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.1580536, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 6, + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:43.294Z", + "status": "passed", + "recordCount": 442, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1021 + }, + { + "name": "pause", + "at": 1468 + }, + { + "name": "seeking", + "at": 2217 + }, + { + "name": "canplay", + "at": 2218 + }, + { + "name": "seeked", + "at": 2233 + }, + { + "name": "loadstart", + "at": 3572 + }, + { + "name": "loadedmetadata", + "at": 3653 + }, + { + "name": "loadeddata", + "at": 3654 + }, + { + "name": "canplay", + "at": 3654 + }, + { + "name": "seeking", + "at": 3682 + }, + { + "name": "seeked", + "at": 3683 + }, + { + "name": "canplay", + "at": 3683 + }, + { + "name": "playing", + "at": 6267 + } + ], + "publicState": { + "at": 6401, + "timeOrigin": 1789407343538, + "qualitySelectedAt": 3056, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2198 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3654 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 542, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 542, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 543, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1021, + "time": 0.0070917, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1468, + "time": 0.2688275, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2217, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2218, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2233, + "time": 3.007821, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3653, + "time": 3.007821, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3653, + "time": 3.007821, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3654, + "time": 3.007821, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3682, + "time": 0.001268, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3683, + "time": 0.001268, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3683, + "time": 0.001268, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6266, + "time": 3.0163159, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.150734, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 7, + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:47.643Z", + "status": "passed", + "recordCount": 848, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1128 + }, + { + "name": "pause", + "at": 1846 + }, + { + "name": "seeking", + "at": 2601 + }, + { + "name": "seeked", + "at": 2618 + }, + { + "name": "loadstart", + "at": 3799 + }, + { + "name": "loadedmetadata", + "at": 4074 + }, + { + "name": "loadeddata", + "at": 4075 + }, + { + "name": "canplay", + "at": 4075 + }, + { + "name": "seeking", + "at": 4105 + }, + { + "name": "seeked", + "at": 4122 + }, + { + "name": "canplay", + "at": 4122 + }, + { + "name": "seeking", + "at": 4152 + }, + { + "name": "seeked", + "at": 4169 + }, + { + "name": "playing", + "at": 6909 + } + ], + "publicState": { + "at": 7438, + "timeOrigin": 1789407347807, + "qualitySelectedAt": 3425, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2586 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 4075 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 554, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 554, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 555, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1128, + "time": 0.0140309, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1846, + "time": 0.532235, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2601, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2618, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 4074, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 4075, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4075, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 4105, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 4122, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4122, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 4152, + "time": 3.0080647, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 4169, + "time": 3.0084812, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6909, + "time": 3.0179694, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.5466948, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 8, + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:50.199Z", + "status": "passed", + "recordCount": 644, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 917 + }, + { + "name": "pause", + "at": 1360 + }, + { + "name": "seeking", + "at": 2280 + }, + { + "name": "canplay", + "at": 2280 + }, + { + "name": "seeked", + "at": 2295 + }, + { + "name": "loadstart", + "at": 3369 + }, + { + "name": "loadedmetadata", + "at": 3645 + }, + { + "name": "loadeddata", + "at": 3645 + }, + { + "name": "canplay", + "at": 3645 + }, + { + "name": "seeking", + "at": 3674 + }, + { + "name": "seeked", + "at": 3689 + }, + { + "name": "canplay", + "at": 3689 + }, + { + "name": "seeking", + "at": 3719 + }, + { + "name": "canplay", + "at": 3719 + }, + { + "name": "seeked", + "at": 3736 + }, + { + "name": "playing", + "at": 6364 + } + ], + "publicState": { + "at": 6671, + "timeOrigin": 1789407350352, + "qualitySelectedAt": 3074, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2250 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3645 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 552, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 552, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 553, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 916, + "time": 0.0043809, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1360, + "time": 0.2801499, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2280, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2280, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2295, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3645, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3645, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3645, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3674, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3689, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3689, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3719, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3719, + "time": 3.008458, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3736, + "time": 3.011483, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6364, + "time": 3.0135942, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.3207804, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 9, + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:56.087Z", + "status": "passed", + "recordCount": 568, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 9022, + "gap": 5034 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1063 + }, + { + "name": "pause", + "at": 1741 + }, + { + "name": "seeking", + "at": 2590 + }, + { + "name": "canplay", + "at": 2592 + }, + { + "name": "seeked", + "at": 2607 + }, + { + "name": "loadstart", + "at": 3883 + }, + { + "name": "loadedmetadata", + "at": 3960 + }, + { + "name": "loadeddata", + "at": 3960 + }, + { + "name": "canplay", + "at": 3961 + }, + { + "name": "seeking", + "at": 3987 + }, + { + "name": "seeked", + "at": 4004 + }, + { + "name": "canplay", + "at": 4004 + }, + { + "name": "playing", + "at": 11652 + } + ], + "publicState": { + "at": 11779, + "timeOrigin": 1789407356320, + "qualitySelectedAt": 3373, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2571 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3960 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 542, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 542, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 542, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1063, + "time": 0.0091494, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1741, + "time": 0.5478166, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2590, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2592, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2607, + "time": 3.007764, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3960, + "time": 3.007764, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3960, + "time": 3.007764, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3961, + "time": 3.007764, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3987, + "time": 3.007764, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 4004, + "time": 0.0014512, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4004, + "time": 0.0014512, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 11652, + "time": 3.0130469, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.1401158, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 10, + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:35:57.839Z", + "status": "passed", + "recordCount": 450, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1088 + }, + { + "name": "pause", + "at": 1717 + }, + { + "name": "seeking", + "at": 2391 + }, + { + "name": "canplay", + "at": 2391 + }, + { + "name": "seeked", + "at": 2406 + }, + { + "name": "loadstart", + "at": 3448 + }, + { + "name": "loadedmetadata", + "at": 3727 + }, + { + "name": "loadeddata", + "at": 3728 + }, + { + "name": "canplay", + "at": 3728 + }, + { + "name": "seeking", + "at": 3757 + }, + { + "name": "seeked", + "at": 3758 + }, + { + "name": "canplay", + "at": 3758 + }, + { + "name": "playing", + "at": 6163 + } + ], + "publicState": { + "at": 6313, + "timeOrigin": 1789407358084, + "qualitySelectedAt": 3150, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2366 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3728 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 553, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 553, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 553, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1088, + "time": 0.0084455, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1717, + "time": 0.5286583, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2391, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2391, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2406, + "time": 3.008801, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3727, + "time": 3.008801, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3728, + "time": 3.008801, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3728, + "time": 3.008801, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3757, + "time": 0.0010971, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3758, + "time": 0.0010971, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3758, + "time": 0.0010971, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6163, + "time": 3.014529, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.1644367, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 11, + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:36:04.667Z", + "status": "passed", + "recordCount": 810, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1080 + }, + { + "name": "pause", + "at": 1834 + }, + { + "name": "seeking", + "at": 2683 + }, + { + "name": "canplay", + "at": 2683 + }, + { + "name": "seeked", + "at": 2699 + }, + { + "name": "loadstart", + "at": 3733 + }, + { + "name": "loadedmetadata", + "at": 4033 + }, + { + "name": "loadeddata", + "at": 4033 + }, + { + "name": "canplay", + "at": 4034 + }, + { + "name": "seeking", + "at": 4063 + }, + { + "name": "seeked", + "at": 4065 + }, + { + "name": "canplay", + "at": 4066 + }, + { + "name": "seeking", + "at": 4095 + }, + { + "name": "seeked", + "at": 4097 + }, + { + "name": "canplay", + "at": 4112 + }, + { + "name": "playing", + "at": 6676 + } + ], + "publicState": { + "at": 7226, + "timeOrigin": 1789407364809, + "qualitySelectedAt": 3400, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2667 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 4034 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 546, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 546, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 546, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1080, + "time": 0.0054235, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1834, + "time": 0.5414715, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2683, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2683, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2699, + "time": 3.0068988, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 4033, + "time": 3.0068988, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 4033, + "time": 3.0068988, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4034, + "time": 3.0068988, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 4063, + "time": 0.0017804, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 4065, + "time": 3.0068988, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 4066, + "time": 3.0068988, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 4095, + "time": 3.0090011, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "seeked", + "at": 4097, + "time": 3.0090011, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "canplay", + "at": 4112, + "time": 3.0090011, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 6676, + "time": 3.0209886, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.5712792, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 12, + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:36:08.360Z", + "status": "passed", + "recordCount": 676, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8860, + "gap": 5024 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 1072 + }, + { + "name": "pause", + "at": 1518 + }, + { + "name": "seeking", + "at": 2379 + }, + { + "name": "canplay", + "at": 2380 + }, + { + "name": "seeked", + "at": 2395 + }, + { + "name": "loadstart", + "at": 3727 + }, + { + "name": "loadedmetadata", + "at": 3805 + }, + { + "name": "loadeddata", + "at": 3805 + }, + { + "name": "canplay", + "at": 3806 + }, + { + "name": "seeking", + "at": 3836 + }, + { + "name": "seeked", + "at": 3836 + }, + { + "name": "canplay", + "at": 3851 + }, + { + "name": "seeking", + "at": 8857 + }, + { + "name": "seeked", + "at": 8858 + }, + { + "name": "canplay", + "at": 8868 + }, + { + "name": "playing", + "at": 11231 + } + ], + "publicState": { + "at": 11812, + "timeOrigin": 1789407368509, + "qualitySelectedAt": 3187, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2352 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3806 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 538, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 538, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 539, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 1072, + "time": 0.0050242, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1518, + "time": 0.2794806, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2379, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2380, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2395, + "time": 3.0083362, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3805, + "time": 3.0083362, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3805, + "time": 3.0083362, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3806, + "time": 3.0083362, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3836, + "time": 0.0016652, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "seeked", + "at": 3836, + "time": 3.0083362, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "canplay", + "at": 3851, + "time": 3.0083362, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 8857, + "time": 3.0100231, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "seeked", + "at": 8858, + "time": 3.0100231, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "canplay", + "at": 8868, + "time": 3.0100231, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 11231, + "time": 3.0163967, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.5967833, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + } + ] + }, + { + "label": "no-trace", + "scope": "same installed combinations; diagnostics on; trace off; repeat-each 3", + "directory": "refactor/.cache/chapter05-native-no-trace-report", + "report": { + "path": "refactor/.cache/chapter05-native-no-trace-report/report.json", + "sha256": "766420da4fd111dbd1af43d70b3a8221e1bdc888c9932a30fbbc2989cf1c5ca3" + }, + "stats": { + "startTime": "2026-09-14T17:37:46.531Z", + "duration": 59003.097, + "expected": 11, + "skipped": 0, + "unexpected": 1, + "flaky": 0 + }, + "exitCode": 1, + "log": { + "path": "refactor/.cache/chapter05-native-no-trace.log", + "sha256": "2ee83c11d8c03b1559527429657544d1884520b8f8295d6399238c4aa4a75bce" + }, + "samples": [ + { + "ordinal": 1, + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:37:47.963Z", + "status": "passed", + "recordCount": 482, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 950 + }, + { + "name": "pause", + "at": 1535 + }, + { + "name": "seeking", + "at": 2150 + }, + { + "name": "canplay", + "at": 2150 + }, + { + "name": "seeked", + "at": 2166 + }, + { + "name": "loadstart", + "at": 3211 + }, + { + "name": "loadedmetadata", + "at": 3493 + }, + { + "name": "loadeddata", + "at": 3493 + }, + { + "name": "canplay", + "at": 3494 + }, + { + "name": "seeking", + "at": 3524 + }, + { + "name": "seeked", + "at": 3525 + }, + { + "name": "canplay", + "at": 3526 + }, + { + "name": "playing", + "at": 5159 + } + ], + "publicState": { + "at": 5209, + "timeOrigin": 1789407468252, + "qualitySelectedAt": 2736, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2125 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3493 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 603, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 603, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 603, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 950, + "time": 0.0064843, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1535, + "time": 0.5430788, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2150, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2150, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2166, + "time": 3.009604, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3493, + "time": 3.009604, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3493, + "time": 3.009604, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3494, + "time": 3.009604, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3523, + "time": 0.0013346, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3525, + "time": 0.0013346, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3526, + "time": 0.0013346, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 5159, + "time": 3.017633, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.0677766, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 2, + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:37:47.964Z", + "status": "passed", + "recordCount": 390, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8488, + "gap": 5026 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 936 + }, + { + "name": "pause", + "at": 1518 + }, + { + "name": "seeking", + "at": 2119 + }, + { + "name": "seeked", + "at": 2135 + }, + { + "name": "loadstart", + "at": 3358 + }, + { + "name": "loadedmetadata", + "at": 3432 + }, + { + "name": "loadeddata", + "at": 3432 + }, + { + "name": "canplay", + "at": 3433 + }, + { + "name": "seeking", + "at": 3462 + }, + { + "name": "seeked", + "at": 3478 + }, + { + "name": "canplay", + "at": 3478 + }, + { + "name": "playing", + "at": 10205 + } + ], + "publicState": { + "at": 10263, + "timeOrigin": 1789407468251, + "qualitySelectedAt": 2661, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2102 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3432 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 602, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 602, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 602, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 936, + "time": 0.0065875, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1518, + "time": 0.542285, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2119, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2135, + "time": 3.0084626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3432, + "time": 3.0084626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3432, + "time": 3.0084626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3433, + "time": 3.0084626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3462, + "time": 3.0084626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3477, + "time": 0.0023485, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3478, + "time": 0.0023485, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 10205, + "time": 3.0160599, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.0736293, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 3, + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:37:53.653Z", + "status": "passed", + "recordCount": 752, + "maxAccessMs": 2, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8307, + "gap": 3408 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 875 + }, + { + "name": "pause", + "at": 1445 + }, + { + "name": "seeking", + "at": 1936 + }, + { + "name": "canplay", + "at": 1937 + }, + { + "name": "seeked", + "at": 1954 + }, + { + "name": "loadstart", + "at": 2987 + }, + { + "name": "loadedmetadata", + "at": 3252 + }, + { + "name": "loadeddata", + "at": 3252 + }, + { + "name": "canplay", + "at": 3252 + }, + { + "name": "seeking", + "at": 3281 + }, + { + "name": "seeked", + "at": 3283 + }, + { + "name": "seeking", + "at": 3312 + }, + { + "name": "seeked", + "at": 3315 + }, + { + "name": "canplay", + "at": 8318 + }, + { + "name": "playing", + "at": 8319 + } + ], + "publicState": { + "at": 8755, + "timeOrigin": 1789407473792, + "qualitySelectedAt": 2531, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 1922 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3252 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 491, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 492, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 492, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 875, + "time": 0.0054156, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1445, + "time": 0.5432777, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 1936, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 1937, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 1954, + "time": 3.0075947, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3252, + "time": 3.0075947, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3252, + "time": 3.0075947, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3252, + "time": 3.0075947, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3281, + "time": 0.0014259, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3283, + "time": 3.0075947, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3312, + "time": 3.0101626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "seeked", + "at": 3315, + "time": 3.0101626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "canplay", + "at": 8318, + "time": 3.0101626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + }, + { + "name": "playing", + "at": 8319, + "time": 3.0101626, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.4353598, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 4, + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:37:58.731Z", + "status": "passed", + "recordCount": 668, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8412, + "gap": 5056 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 884 + }, + { + "name": "pause", + "at": 1470 + }, + { + "name": "seeking", + "at": 1980 + }, + { + "name": "canplay", + "at": 1980 + }, + { + "name": "seeked", + "at": 1996 + }, + { + "name": "loadstart", + "at": 3028 + }, + { + "name": "loadedmetadata", + "at": 3342 + }, + { + "name": "loadeddata", + "at": 3342 + }, + { + "name": "canplay", + "at": 3342 + }, + { + "name": "seeking", + "at": 3371 + }, + { + "name": "seeked", + "at": 3372 + }, + { + "name": "canplay", + "at": 3372 + }, + { + "name": "seeking", + "at": 3402 + }, + { + "name": "seeked", + "at": 3403 + }, + { + "name": "canplay", + "at": 3403 + }, + { + "name": "playing", + "at": 10148 + } + ], + "publicState": { + "at": 10571, + "timeOrigin": 1789407478861, + "qualitySelectedAt": 2553, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 1958 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3342 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 483, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 483, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 483, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 884, + "time": 0.0075341, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1470, + "time": 0.5316844, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 1980, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 1980, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 1996, + "time": 3.007945, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3342, + "time": 3.007945, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3342, + "time": 3.007945, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3342, + "time": 3.007945, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3371, + "time": 0.0017414, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3372, + "time": 3.007945, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3372, + "time": 3.007945, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3402, + "time": 3.0094112, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3403, + "time": 3.0094112, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3403, + "time": 3.0094112, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 10148, + "time": 3.0131532, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.4358792, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 5, + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:03.262Z", + "status": "passed", + "recordCount": 476, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 895 + }, + { + "name": "pause", + "at": 1486 + }, + { + "name": "seeking", + "at": 1993 + }, + { + "name": "seeked", + "at": 2009 + }, + { + "name": "loadstart", + "at": 3052 + }, + { + "name": "loadedmetadata", + "at": 3347 + }, + { + "name": "loadeddata", + "at": 3348 + }, + { + "name": "canplay", + "at": 3348 + }, + { + "name": "seeking", + "at": 3377 + }, + { + "name": "seeked", + "at": 3379 + }, + { + "name": "canplay", + "at": 3379 + }, + { + "name": "playing", + "at": 5177 + } + ], + "publicState": { + "at": 5217, + "timeOrigin": 1789407483477, + "qualitySelectedAt": 2565, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 1966 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3348 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 491, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 3 + }, + { + "name": "loadeddata", + "at": 492, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 3 + }, + { + "name": "canplay", + "at": 492, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 3 + }, + { + "name": "playing", + "at": 895, + "time": 0.0062727, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1486, + "time": 0.5334564, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 1993, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2009, + "time": 3.0095315, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3347, + "time": 3.0095315, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3347, + "time": 3.0095315, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3348, + "time": 3.0095315, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3377, + "time": 0.0012139, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3379, + "time": 0.0012139, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3379, + "time": 0.0012139, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 5177, + "time": 3.0158839, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.0556214, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 6, + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:08.921Z", + "status": "passed", + "recordCount": 392, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 887 + }, + { + "name": "pause", + "at": 1455 + }, + { + "name": "seeking", + "at": 2058 + }, + { + "name": "canplay", + "at": 2058 + }, + { + "name": "seeked", + "at": 2074 + }, + { + "name": "loadstart", + "at": 3122 + }, + { + "name": "loadedmetadata", + "at": 3389 + }, + { + "name": "loadeddata", + "at": 3389 + }, + { + "name": "canplay", + "at": 3390 + }, + { + "name": "seeking", + "at": 3420 + }, + { + "name": "seeked", + "at": 3435 + }, + { + "name": "canplay", + "at": 3435 + }, + { + "name": "playing", + "at": 5077 + } + ], + "publicState": { + "at": 5108, + "timeOrigin": 1789407489067, + "qualitySelectedAt": 2614, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2042 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3389 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 497, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 497, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 497, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 887, + "time": 0.0097511, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1455, + "time": 0.5318355, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2058, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2058, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2074, + "time": 3.0080799, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3389, + "time": 3.0080799, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3389, + "time": 3.0080799, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3390, + "time": 3.0080799, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3420, + "time": 3.0080799, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3435, + "time": 0.001138, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3435, + "time": 0.001138, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 5076, + "time": 3.0151644, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.0462754, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 7, + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:10.143Z", + "status": "passed", + "recordCount": 758, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8386, + "gap": 5046 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 896 + }, + { + "name": "pause", + "at": 1476 + }, + { + "name": "seeking", + "at": 1974 + }, + { + "name": "canplay", + "at": 1975 + }, + { + "name": "seeked", + "at": 1991 + }, + { + "name": "loadstart", + "at": 3026 + }, + { + "name": "loadedmetadata", + "at": 3307 + }, + { + "name": "loadeddata", + "at": 3307 + }, + { + "name": "canplay", + "at": 3307 + }, + { + "name": "seeking", + "at": 3337 + }, + { + "name": "seeked", + "at": 3339 + }, + { + "name": "seeking", + "at": 3368 + }, + { + "name": "seeked", + "at": 3371 + }, + { + "name": "canplay", + "at": 3371 + }, + { + "name": "playing", + "at": 10156 + } + ], + "publicState": { + "at": 10582, + "timeOrigin": 1789407490371, + "qualitySelectedAt": 2553, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 1961 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3307 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 512, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 512, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 512, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 896, + "time": 0.0090918, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1476, + "time": 0.5431533, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 1974, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 1975, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 1991, + "time": 3.0084474, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3307, + "time": 3.0084474, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3307, + "time": 3.0084474, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3307, + "time": 3.0084474, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3337, + "time": 0.000604, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3339, + "time": 3.0084474, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3368, + "time": 3.0108258, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3371, + "time": 3.0108258, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3371, + "time": 3.0108258, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 10156, + "time": 3.0133975, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.4397713, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 8, + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:14.373Z", + "status": "passed", + "recordCount": 650, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 851 + }, + { + "name": "pause", + "at": 1434 + }, + { + "name": "seeking", + "at": 1945 + }, + { + "name": "canplay", + "at": 1945 + }, + { + "name": "seeked", + "at": 1962 + }, + { + "name": "loadstart", + "at": 3002 + }, + { + "name": "loadedmetadata", + "at": 3267 + }, + { + "name": "loadeddata", + "at": 3267 + }, + { + "name": "canplay", + "at": 3268 + }, + { + "name": "seeking", + "at": 3297 + }, + { + "name": "seeked", + "at": 3297 + }, + { + "name": "canplay", + "at": 3298 + }, + { + "name": "seeking", + "at": 3328 + }, + { + "name": "seeked", + "at": 3329 + }, + { + "name": "canplay", + "at": 3329 + }, + { + "name": "playing", + "at": 5064 + } + ], + "publicState": { + "at": 5486, + "timeOrigin": 1789407494507, + "qualitySelectedAt": 2515, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 1929 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3268 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 465, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 465, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 466, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 851, + "time": 0.0080765, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1434, + "time": 0.5310585, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 1945, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 1945, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 1962, + "time": 3.0080376, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3267, + "time": 3.0080376, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3267, + "time": 3.0080376, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3268, + "time": 3.0080376, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3297, + "time": 0.0013103, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3297, + "time": 3.0080376, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3298, + "time": 3.0080376, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3327, + "time": 3.0092408, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3329, + "time": 3.0092408, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3329, + "time": 3.0092408, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 5064, + "time": 3.0143679, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.4371243, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 9, + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:20.758Z", + "status": "passed", + "recordCount": 486, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8374, + "gap": 5020 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 884 + }, + { + "name": "pause", + "at": 1485 + }, + { + "name": "seeking", + "at": 1994 + }, + { + "name": "canplay", + "at": 1994 + }, + { + "name": "seeked", + "at": 2010 + }, + { + "name": "loadstart", + "at": 3044 + }, + { + "name": "loadedmetadata", + "at": 3322 + }, + { + "name": "loadeddata", + "at": 3322 + }, + { + "name": "canplay", + "at": 3323 + }, + { + "name": "seeking", + "at": 3351 + }, + { + "name": "seeked", + "at": 3354 + }, + { + "name": "canplay", + "at": 3354 + }, + { + "name": "playing", + "at": 10084 + } + ], + "publicState": { + "at": 10135, + "timeOrigin": 1789407500987, + "qualitySelectedAt": 2551, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 1968 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3323 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 498, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 498, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 498, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 883, + "time": 0.009313, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1485, + "time": 0.5481443, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 1994, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 1994, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2010, + "time": 3.0090367, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3322, + "time": 3.0090367, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3322, + "time": 3.0090367, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3323, + "time": 3.0090367, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3351, + "time": 0.0022715, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3354, + "time": 0.0022715, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3354, + "time": 0.0022715, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 10083, + "time": 3.0143809, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.0658024, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 10, + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:21.734Z", + "status": "passed", + "recordCount": 410, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8395, + "gap": 5021 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 918 + }, + { + "name": "pause", + "at": 1499 + }, + { + "name": "seeking", + "at": 2026 + }, + { + "name": "canplay", + "at": 2027 + }, + { + "name": "seeked", + "at": 2043 + }, + { + "name": "loadstart", + "at": 3078 + }, + { + "name": "loadedmetadata", + "at": 3343 + }, + { + "name": "loadeddata", + "at": 3343 + }, + { + "name": "canplay", + "at": 3343 + }, + { + "name": "seeking", + "at": 3373 + }, + { + "name": "seeked", + "at": 3374 + }, + { + "name": "canplay", + "at": 3374 + }, + { + "name": "playing", + "at": 10384 + } + ], + "publicState": { + "at": 10439, + "timeOrigin": 1789407501956, + "qualitySelectedAt": 2608, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2011 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3343 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 501, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 501, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 502, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 918, + "time": 0.0112131, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1499, + "time": 0.5761197, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2026, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2027, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2043, + "time": 3.0081307, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3343, + "time": 3.0081307, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3343, + "time": 3.0081307, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3343, + "time": 3.0081307, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3373, + "time": 0.0015652, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3374, + "time": 0.0015652, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3374, + "time": 0.0015652, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 10384, + "time": 3.0164641, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.0711506, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 11, + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:31.338Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate", + "recordCount": 614, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 8453, + "gap": 5033 + }, + { + "at": 13454, + "gap": 5001 + } + ], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 941 + }, + { + "name": "pause", + "at": 1531 + }, + { + "name": "seeking", + "at": 2053 + }, + { + "name": "canplay", + "at": 2053 + }, + { + "name": "seeked", + "at": 2068 + }, + { + "name": "loadstart", + "at": 3109 + }, + { + "name": "loadedmetadata", + "at": 3390 + }, + { + "name": "loadeddata", + "at": 3390 + }, + { + "name": "canplay", + "at": 3390 + }, + { + "name": "seeking", + "at": 3418 + }, + { + "name": "seeked", + "at": 3435 + }, + { + "name": "canplay", + "at": 3435 + }, + { + "name": "seeking", + "at": 13453 + }, + { + "name": "canplay", + "at": 13473 + }, + { + "name": "seeked", + "at": 13611 + } + ], + "publicState": { + "at": 13655, + "timeOrigin": 1789407511493, + "qualitySelectedAt": 2611, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 2028 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3390 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 543, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 543, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 543, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 941, + "time": 0.0079412, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1531, + "time": 0.5513656, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2053, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 2053, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2068, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3390, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 3 + }, + { + "name": "loadeddata", + "at": 3390, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 3 + }, + { + "name": "canplay", + "at": 3390, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 3 + }, + { + "name": "seeking", + "at": 3418, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3435, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3435, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 13453, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "canplay", + "at": 13473, + "time": 3.0086753, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 13611, + "time": 3.0189368, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + } + ], + "time": 3.0189368, + "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" + } + ] + }, + "pageErrors": [] + }, + { + "ordinal": 12, + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:38:32.616Z", + "status": "passed", + "recordCount": 644, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": null, + "nativeEvents": [ + { + "name": "playing", + "at": 912 + }, + { + "name": "pause", + "at": 1491 + }, + { + "name": "seeking", + "at": 2002 + }, + { + "name": "seeked", + "at": 2018 + }, + { + "name": "loadstart", + "at": 3054 + }, + { + "name": "loadedmetadata", + "at": 3305 + }, + { + "name": "loadeddata", + "at": 3305 + }, + { + "name": "canplay", + "at": 3306 + }, + { + "name": "seeking", + "at": 3335 + }, + { + "name": "seeked", + "at": 3336 + }, + { + "name": "canplay", + "at": 3336 + }, + { + "name": "seeking", + "at": 3366 + }, + { + "name": "seeked", + "at": 3367 + }, + { + "name": "canplay", + "at": 3367 + }, + { + "name": "playing", + "at": 4989 + } + ], + "publicState": { + "at": 5422, + "timeOrigin": 1789407512757, + "qualitySelectedAt": 2562, + "events": [ + { + "name": "seek", + "value": 3.0064516129032257, + "at": 1972 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A", + "at": 3306 + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "at": 487, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 487, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 487, + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 912, + "time": 0.0081415, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "at": 1491, + "time": 0.5398439, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 2001, + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 2018, + "time": 3.0071108, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "at": 3305, + "time": 3.0071108, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "at": 3305, + "time": 3.0071108, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3306, + "time": 3.0071108, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3335, + "time": 0.0009714, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3336, + "time": 3.0071108, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3336, + "time": 3.0071108, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "at": 3366, + "time": 3.0082454, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "at": 3367, + "time": 3.0082454, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "at": 3367, + "time": 3.0082454, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "at": 4989, + "time": 3.0160971, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": false, + "readyState": 4 + } + ], + "time": 3.449239, + "paused": false, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "Updated after quality" + } + ] + }, + "pageErrors": [] + } + ] + }, + { + "label": "control", + "scope": "pure native media; metadata restore only; no correction; repeat-each 6", + "directory": "refactor/.cache/chapter05-native-control-report", + "report": { + "path": "refactor/.cache/chapter05-native-control-report/report.json", + "sha256": "59a14ba7970129167bed9b5378a8ae94562920e19694b1203ade3d62d54f296f" + }, + "stats": { + "startTime": "2026-09-14T17:40:31.758Z", + "duration": 13809.145999999999, + "expected": 0, + "skipped": 0, + "unexpected": 6, + "flaky": 0 + }, + "exitCode": 1, + "log": { + "path": "refactor/.cache/chapter05-native-control.log", + "sha256": "2d64d6cf5e2da0f6c4ab845a278ff79569ede64a7f3d007c25e3869030d1ee65" + }, + "samples": [ + { + "ordinal": 1, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:40:34.137Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeCloseTo\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m, \u001b[22mprecision\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m3.009658\u001b[39m\nReceived: \u001b[31m0.000468\u001b[39m\n\nExpected precision: 1\nExpected difference: < \u001b[32m0.05\u001b[39m\nReceived difference: \u001b[31m3.00919\u001b[39m", + "recordCount": 30, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 0.000468, + "target": 3.009658, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 75 + }, + { + "name": "loadedmetadata", + "at": 599 + }, + { + "name": "loadeddata", + "at": 599 + }, + { + "name": "canplay", + "at": 599 + }, + { + "name": "playing", + "at": 934 + }, + { + "name": "pause", + "at": 1531 + }, + { + "name": "seeking", + "at": 1566 + }, + { + "name": "canplay", + "at": 1567 + }, + { + "name": "seeked", + "at": 1570 + }, + { + "name": "loadstart", + "at": 2298 + }, + { + "name": "loadedmetadata", + "at": 2380 + }, + { + "name": "loadeddata", + "at": 2380 + }, + { + "name": "canplay", + "at": 2380 + }, + { + "name": "seeking", + "at": 2411 + }, + { + "name": "seeked", + "at": 2411 + }, + { + "name": "canplay", + "at": 2411 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 2, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:40:34.120Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeCloseTo\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m, \u001b[22mprecision\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m3.0114336\u001b[39m\nReceived: \u001b[31m0.0014442\u001b[39m\n\nExpected precision: 1\nExpected difference: < \u001b[32m0.05\u001b[39m\nReceived difference: \u001b[31m3.0099894000000003\u001b[39m", + "recordCount": 30, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 0.0014442, + "target": 3.0114336, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 82 + }, + { + "name": "loadedmetadata", + "at": 644 + }, + { + "name": "loadeddata", + "at": 644 + }, + { + "name": "canplay", + "at": 644 + }, + { + "name": "playing", + "at": 957 + }, + { + "name": "pause", + "at": 1520 + }, + { + "name": "seeking", + "at": 1528 + }, + { + "name": "canplay", + "at": 1529 + }, + { + "name": "seeked", + "at": 1549 + }, + { + "name": "loadstart", + "at": 2283 + }, + { + "name": "loadedmetadata", + "at": 2357 + }, + { + "name": "loadeddata", + "at": 2358 + }, + { + "name": "canplay", + "at": 2358 + }, + { + "name": "seeking", + "at": 2388 + }, + { + "name": "seeked", + "at": 2389 + }, + { + "name": "canplay", + "at": 2403 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 3, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:40:37.971Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeCloseTo\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m, \u001b[22mprecision\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m3.0099653\u001b[39m\nReceived: \u001b[31m0.0015638\u001b[39m\n\nExpected precision: 1\nExpected difference: < \u001b[32m0.05\u001b[39m\nReceived difference: \u001b[31m3.0084015\u001b[39m", + "recordCount": 30, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 0.0015638, + "target": 3.0099653, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 81 + }, + { + "name": "loadedmetadata", + "at": 566 + }, + { + "name": "loadeddata", + "at": 566 + }, + { + "name": "canplay", + "at": 566 + }, + { + "name": "playing", + "at": 877 + }, + { + "name": "pause", + "at": 1491 + }, + { + "name": "seeking", + "at": 1530 + }, + { + "name": "canplay", + "at": 1530 + }, + { + "name": "seeked", + "at": 1534 + }, + { + "name": "loadstart", + "at": 2303 + }, + { + "name": "loadedmetadata", + "at": 2391 + }, + { + "name": "loadeddata", + "at": 2392 + }, + { + "name": "canplay", + "at": 2392 + }, + { + "name": "seeking", + "at": 2420 + }, + { + "name": "seeked", + "at": 2431 + }, + { + "name": "canplay", + "at": 2435 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 4, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:40:38.008Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeCloseTo\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m, \u001b[22mprecision\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m3.008534\u001b[39m\nReceived: \u001b[31m0.0023366\u001b[39m\n\nExpected precision: 1\nExpected difference: < \u001b[32m0.05\u001b[39m\nReceived difference: \u001b[31m3.0061974\u001b[39m", + "recordCount": 30, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 0.0023366, + "target": 3.008534, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 80 + }, + { + "name": "loadedmetadata", + "at": 564 + }, + { + "name": "loadeddata", + "at": 564 + }, + { + "name": "canplay", + "at": 564 + }, + { + "name": "playing", + "at": 922 + }, + { + "name": "pause", + "at": 1477 + }, + { + "name": "seeking", + "at": 1496 + }, + { + "name": "canplay", + "at": 1497 + }, + { + "name": "seeked", + "at": 1514 + }, + { + "name": "loadstart", + "at": 2093 + }, + { + "name": "loadedmetadata", + "at": 2400 + }, + { + "name": "loadeddata", + "at": 2400 + }, + { + "name": "canplay", + "at": 2400 + }, + { + "name": "seeking", + "at": 2418 + }, + { + "name": "seeked", + "at": 2448 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 5, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:40:41.863Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeCloseTo\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m, \u001b[22mprecision\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m3.0092494\u001b[39m\nReceived: \u001b[31m0.0012832\u001b[39m\n\nExpected precision: 1\nExpected difference: < \u001b[32m0.05\u001b[39m\nReceived difference: \u001b[31m3.0079662\u001b[39m", + "recordCount": 30, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 0.0012832, + "target": 3.0092494, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 75 + }, + { + "name": "loadedmetadata", + "at": 527 + }, + { + "name": "loadeddata", + "at": 527 + }, + { + "name": "canplay", + "at": 527 + }, + { + "name": "playing", + "at": 886 + }, + { + "name": "pause", + "at": 1512 + }, + { + "name": "seeking", + "at": 1522 + }, + { + "name": "canplay", + "at": 1522 + }, + { + "name": "seeked", + "at": 1539 + }, + { + "name": "loadstart", + "at": 2115 + }, + { + "name": "loadedmetadata", + "at": 2373 + }, + { + "name": "loadeddata", + "at": 2374 + }, + { + "name": "canplay", + "at": 2374 + }, + { + "name": "seeking", + "at": 2396 + }, + { + "name": "seeked", + "at": 2401 + }, + { + "name": "canplay", + "at": 2412 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 6, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:40:41.892Z", + "status": "failed", + "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeCloseTo\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m, \u001b[22mprecision\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m3.009782\u001b[39m\nReceived: \u001b[31m0.0015251\u001b[39m\n\nExpected precision: 1\nExpected difference: < \u001b[32m0.05\u001b[39m\nReceived difference: \u001b[31m3.0082569\u001b[39m", + "recordCount": 30, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 0.0015251, + "target": 3.009782, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 80 + }, + { + "name": "loadedmetadata", + "at": 534 + }, + { + "name": "loadeddata", + "at": 534 + }, + { + "name": "canplay", + "at": 534 + }, + { + "name": "playing", + "at": 887 + }, + { + "name": "pause", + "at": 1435 + }, + { + "name": "seeking", + "at": 1450 + }, + { + "name": "canplay", + "at": 1450 + }, + { + "name": "seeked", + "at": 1454 + }, + { + "name": "loadstart", + "at": 2193 + }, + { + "name": "loadedmetadata", + "at": 2270 + }, + { + "name": "loadeddata", + "at": 2270 + }, + { + "name": "canplay", + "at": 2270 + }, + { + "name": "seeking", + "at": 2294 + }, + { + "name": "seeked", + "at": 2314 + }, + { + "name": "canplay", + "at": 2323 + } + ], + "publicState": null, + "pageErrors": [] + } + ] + }, + { + "label": "correction", + "scope": "pure native media; one direct correction on seeked; repeat-each 6", + "directory": "refactor/.cache/chapter05-native-correction-report", + "report": { + "path": "refactor/.cache/chapter05-native-correction-report/report.json", + "sha256": "bafc5e8c765c76caacff28e0151d9daec5dfe8a244984516aa61c72f61c2fcb5" + }, + "stats": { + "startTime": "2026-09-14T17:42:31.950Z", + "duration": 19923.761, + "expected": 6, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "exitCode": 0, + "log": { + "path": "refactor/.cache/chapter05-native-correction.log", + "sha256": "4217dc21730bc6b332e80c3c84cf409a926555352f659a73e6ed02f0efcd73ef" + }, + "samples": [ + { + "ordinal": 1, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:42:34.279Z", + "status": "passed", + "recordCount": 38, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0110796, + "target": 3.0095943, + "corrections": 1, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 91 + }, + { + "name": "loadedmetadata", + "at": 576 + }, + { + "name": "loadeddata", + "at": 577 + }, + { + "name": "canplay", + "at": 577 + }, + { + "name": "playing", + "at": 917 + }, + { + "name": "pause", + "at": 1524 + }, + { + "name": "seeking", + "at": 1539 + }, + { + "name": "canplay", + "at": 1539 + }, + { + "name": "seeked", + "at": 1546 + }, + { + "name": "loadstart", + "at": 2020 + }, + { + "name": "loadedmetadata", + "at": 2260 + }, + { + "name": "loadeddata", + "at": 2260 + }, + { + "name": "canplay", + "at": 2260 + }, + { + "name": "seeking", + "at": 2285 + }, + { + "name": "seeked", + "at": 2294 + }, + { + "name": "canplay", + "at": 2300 + }, + { + "name": "seeking", + "at": 2315 + }, + { + "name": "seeked", + "at": 2316 + }, + { + "name": "canplay", + "at": 2316 + }, + { + "name": "playing", + "at": 2581 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 2, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:42:34.291Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 7463, + "gap": 5022 + } + ], + "position": { + "time": 3.0095662, + "target": 3.0089794, + "corrections": 1, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 91 + }, + { + "name": "loadedmetadata", + "at": 570 + }, + { + "name": "loadeddata", + "at": 570 + }, + { + "name": "canplay", + "at": 570 + }, + { + "name": "playing", + "at": 981 + }, + { + "name": "pause", + "at": 1570 + }, + { + "name": "seeking", + "at": 1585 + }, + { + "name": "canplay", + "at": 1586 + }, + { + "name": "seeked", + "at": 1601 + }, + { + "name": "loadstart", + "at": 2145 + }, + { + "name": "loadedmetadata", + "at": 2408 + }, + { + "name": "loadeddata", + "at": 2408 + }, + { + "name": "canplay", + "at": 2409 + }, + { + "name": "seeking", + "at": 2440 + }, + { + "name": "seeked", + "at": 2440 + }, + { + "name": "canplay", + "at": 2456 + }, + { + "name": "seeking", + "at": 7463 + }, + { + "name": "seeked", + "at": 7463 + }, + { + "name": "canplay", + "at": 7470 + }, + { + "name": "playing", + "at": 7668 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 3, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:42:38.477Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 7271, + "gap": 5003 + } + ], + "position": { + "time": 3.0102495, + "target": 3.0095412, + "corrections": 1, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 68 + }, + { + "name": "loadedmetadata", + "at": 463 + }, + { + "name": "loadeddata", + "at": 463 + }, + { + "name": "canplay", + "at": 464 + }, + { + "name": "playing", + "at": 832 + }, + { + "name": "pause", + "at": 1381 + }, + { + "name": "seeking", + "at": 1391 + }, + { + "name": "canplay", + "at": 1391 + }, + { + "name": "seeked", + "at": 1409 + }, + { + "name": "loadstart", + "at": 2153 + }, + { + "name": "loadedmetadata", + "at": 2218 + }, + { + "name": "loadeddata", + "at": 2218 + }, + { + "name": "canplay", + "at": 2218 + }, + { + "name": "seeking", + "at": 2237 + }, + { + "name": "seeked", + "at": 2250 + }, + { + "name": "canplay", + "at": 2252 + }, + { + "name": "seeking", + "at": 2268 + }, + { + "name": "seeked", + "at": 2269 + }, + { + "name": "canplay", + "at": 7277 + }, + { + "name": "playing", + "at": 7483 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 4, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:42:43.516Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0120583, + "target": 3.0097159, + "corrections": 1, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 71 + }, + { + "name": "loadedmetadata", + "at": 495 + }, + { + "name": "loadeddata", + "at": 495 + }, + { + "name": "canplay", + "at": 495 + }, + { + "name": "playing", + "at": 835 + }, + { + "name": "pause", + "at": 1386 + }, + { + "name": "seeking", + "at": 1394 + }, + { + "name": "canplay", + "at": 1395 + }, + { + "name": "seeked", + "at": 1412 + }, + { + "name": "loadstart", + "at": 2003 + }, + { + "name": "loadedmetadata", + "at": 2267 + }, + { + "name": "loadeddata", + "at": 2267 + }, + { + "name": "canplay", + "at": 2267 + }, + { + "name": "seeking", + "at": 2297 + }, + { + "name": "seeked", + "at": 2298 + }, + { + "name": "canplay", + "at": 2298 + }, + { + "name": "seeking", + "at": 2329 + }, + { + "name": "canplay", + "at": 2329 + }, + { + "name": "seeked", + "at": 2345 + }, + { + "name": "playing", + "at": 2531 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 5, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:42:47.460Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0107413, + "target": 3.00955, + "corrections": 1, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 78 + }, + { + "name": "loadedmetadata", + "at": 514 + }, + { + "name": "loadeddata", + "at": 514 + }, + { + "name": "canplay", + "at": 514 + }, + { + "name": "playing", + "at": 891 + }, + { + "name": "pause", + "at": 1453 + }, + { + "name": "seeking", + "at": 1467 + }, + { + "name": "canplay", + "at": 1467 + }, + { + "name": "seeked", + "at": 1479 + }, + { + "name": "loadstart", + "at": 2043 + }, + { + "name": "loadedmetadata", + "at": 2263 + }, + { + "name": "loadeddata", + "at": 2263 + }, + { + "name": "canplay", + "at": 2263 + }, + { + "name": "seeking", + "at": 2292 + }, + { + "name": "seeked", + "at": 2292 + }, + { + "name": "canplay", + "at": 2308 + }, + { + "name": "seeking", + "at": 2323 + }, + { + "name": "seeked", + "at": 2324 + }, + { + "name": "playing", + "at": 2569 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 6, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:42:47.667Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0130571, + "target": 3.0104253, + "corrections": 1, + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 76 + }, + { + "name": "loadedmetadata", + "at": 491 + }, + { + "name": "loadeddata", + "at": 491 + }, + { + "name": "canplay", + "at": 491 + }, + { + "name": "playing", + "at": 856 + }, + { + "name": "pause", + "at": 1441 + }, + { + "name": "seeking", + "at": 1449 + }, + { + "name": "canplay", + "at": 1450 + }, + { + "name": "seeked", + "at": 1468 + }, + { + "name": "loadstart", + "at": 2213 + }, + { + "name": "loadedmetadata", + "at": 2295 + }, + { + "name": "loadeddata", + "at": 2295 + }, + { + "name": "canplay", + "at": 2295 + }, + { + "name": "seeking", + "at": 2325 + }, + { + "name": "seeked", + "at": 2325 + }, + { + "name": "canplay", + "at": 2325 + }, + { + "name": "seeking", + "at": 2356 + }, + { + "name": "canplay", + "at": 2356 + }, + { + "name": "seeked", + "at": 2372 + }, + { + "name": "playing", + "at": 2681 + } + ], + "publicState": null, + "pageErrors": [] + } + ] + }, + { + "label": "deferred", + "scope": "pure native media; one correction deferred with setTimeout(0); repeat-each 6", + "directory": "refactor/.cache/chapter05-native-deferred-report", + "report": { + "path": "refactor/.cache/chapter05-native-deferred-report/report.json", + "sha256": "6799b3148d90d93c52605050bec710e73b3ac72156b5203d7a92be6f84ecd927" + }, + "stats": { + "startTime": "2026-09-14T17:44:21.225Z", + "duration": 20091.748, + "expected": 6, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "exitCode": 0, + "log": { + "path": "refactor/.cache/chapter05-native-deferred.log", + "sha256": "1e28f7211c03de999a7fad9dee31b4eabb88961a8ceb1c5c107880b32026e840" + }, + "samples": [ + { + "ordinal": 1, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:44:23.576Z", + "status": "passed", + "recordCount": 38, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0117667, + "target": 3.0117667, + "corrections": 1, + "correctionMode": "deferred", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 80 + }, + { + "name": "loadedmetadata", + "at": 576 + }, + { + "name": "loadeddata", + "at": 576 + }, + { + "name": "canplay", + "at": 577 + }, + { + "name": "playing", + "at": 941 + }, + { + "name": "pause", + "at": 1505 + }, + { + "name": "seeking", + "at": 1545 + }, + { + "name": "canplay", + "at": 1545 + }, + { + "name": "seeked", + "at": 1552 + }, + { + "name": "loadstart", + "at": 2332 + }, + { + "name": "loadedmetadata", + "at": 2436 + }, + { + "name": "loadeddata", + "at": 2436 + }, + { + "name": "canplay", + "at": 2437 + }, + { + "name": "seeking", + "at": 2464 + }, + { + "name": "seeked", + "at": 2496 + }, + { + "name": "canplay", + "at": 2497 + }, + { + "name": "seeking", + "at": 2542 + }, + { + "name": "canplay", + "at": 2542 + }, + { + "name": "seeked", + "at": 2557 + }, + { + "name": "playing", + "at": 2674 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 2, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:44:23.574Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0132269, + "target": 3.0122529, + "corrections": 1, + "correctionMode": "deferred", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 87 + }, + { + "name": "loadedmetadata", + "at": 583 + }, + { + "name": "loadeddata", + "at": 583 + }, + { + "name": "canplay", + "at": 583 + }, + { + "name": "playing", + "at": 947 + }, + { + "name": "pause", + "at": 1511 + }, + { + "name": "seeking", + "at": 1551 + }, + { + "name": "canplay", + "at": 1551 + }, + { + "name": "seeked", + "at": 1559 + }, + { + "name": "loadstart", + "at": 2350 + }, + { + "name": "loadedmetadata", + "at": 2435 + }, + { + "name": "loadeddata", + "at": 2436 + }, + { + "name": "canplay", + "at": 2436 + }, + { + "name": "seeking", + "at": 2455 + }, + { + "name": "seeked", + "at": 2478 + }, + { + "name": "canplay", + "at": 2487 + }, + { + "name": "seeking", + "at": 2502 + }, + { + "name": "seeked", + "at": 2502 + }, + { + "name": "canplay", + "at": 2518 + }, + { + "name": "playing", + "at": 2721 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 3, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:44:27.644Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0110531, + "target": 3.009924, + "corrections": 1, + "correctionMode": "deferred", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 77 + }, + { + "name": "loadedmetadata", + "at": 529 + }, + { + "name": "loadeddata", + "at": 529 + }, + { + "name": "canplay", + "at": 529 + }, + { + "name": "playing", + "at": 914 + }, + { + "name": "pause", + "at": 1497 + }, + { + "name": "seeking", + "at": 1513 + }, + { + "name": "canplay", + "at": 1513 + }, + { + "name": "seeked", + "at": 1517 + }, + { + "name": "loadstart", + "at": 2088 + }, + { + "name": "loadedmetadata", + "at": 2325 + }, + { + "name": "loadeddata", + "at": 2325 + }, + { + "name": "canplay", + "at": 2325 + }, + { + "name": "seeking", + "at": 2351 + }, + { + "name": "seeked", + "at": 2353 + }, + { + "name": "canplay", + "at": 2366 + }, + { + "name": "seeking", + "at": 2382 + }, + { + "name": "seeked", + "at": 2382 + }, + { + "name": "canplay", + "at": 2383 + }, + { + "name": "playing", + "at": 2585 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 4, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:44:27.924Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.011053, + "target": 3.009918, + "corrections": 1, + "correctionMode": "deferred", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 123 + }, + { + "name": "loadedmetadata", + "at": 524 + }, + { + "name": "loadeddata", + "at": 524 + }, + { + "name": "canplay", + "at": 524 + }, + { + "name": "playing", + "at": 932 + }, + { + "name": "pause", + "at": 1576 + }, + { + "name": "seeking", + "at": 1602 + }, + { + "name": "canplay", + "at": 1603 + }, + { + "name": "seeked", + "at": 1607 + }, + { + "name": "loadstart", + "at": 2347 + }, + { + "name": "loadedmetadata", + "at": 2412 + }, + { + "name": "loadeddata", + "at": 2412 + }, + { + "name": "canplay", + "at": 2412 + }, + { + "name": "seeking", + "at": 2430 + }, + { + "name": "seeked", + "at": 2448 + }, + { + "name": "canplay", + "at": 2461 + }, + { + "name": "seeking", + "at": 2475 + }, + { + "name": "seeked", + "at": 2475 + }, + { + "name": "playing", + "at": 2691 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 5, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:44:31.784Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.0108145, + "target": 3.0096976, + "corrections": 1, + "correctionMode": "deferred", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 79 + }, + { + "name": "loadedmetadata", + "at": 539 + }, + { + "name": "loadeddata", + "at": 539 + }, + { + "name": "canplay", + "at": 539 + }, + { + "name": "playing", + "at": 934 + }, + { + "name": "pause", + "at": 1541 + }, + { + "name": "seeking", + "at": 1553 + }, + { + "name": "canplay", + "at": 1553 + }, + { + "name": "seeked", + "at": 1570 + }, + { + "name": "loadstart", + "at": 2143 + }, + { + "name": "loadedmetadata", + "at": 2366 + }, + { + "name": "loadeddata", + "at": 2366 + }, + { + "name": "canplay", + "at": 2366 + }, + { + "name": "seeking", + "at": 2393 + }, + { + "name": "seeked", + "at": 2393 + }, + { + "name": "canplay", + "at": 2409 + }, + { + "name": "seeking", + "at": 2424 + }, + { + "name": "seeked", + "at": 2424 + }, + { + "name": "canplay", + "at": 2424 + }, + { + "name": "playing", + "at": 2634 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 6, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "webkit", + "browser": "26.6", + "startTime": "2026-09-14T17:44:32.327Z", + "status": "passed", + "recordCount": 40, + "maxAccessMs": 1, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [ + { + "at": 7304, + "gap": 5104 + } + ], + "position": { + "time": 3.0097807, + "target": 3.0086361, + "corrections": 1, + "correctionMode": "deferred", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 91 + }, + { + "name": "loadedmetadata", + "at": 495 + }, + { + "name": "loadeddata", + "at": 495 + }, + { + "name": "canplay", + "at": 495 + }, + { + "name": "playing", + "at": 853 + }, + { + "name": "pause", + "at": 1427 + }, + { + "name": "seeking", + "at": 1442 + }, + { + "name": "canplay", + "at": 1442 + }, + { + "name": "seeked", + "at": 1446 + }, + { + "name": "loadstart", + "at": 2021 + }, + { + "name": "loadedmetadata", + "at": 2250 + }, + { + "name": "loadeddata", + "at": 2251 + }, + { + "name": "canplay", + "at": 2251 + }, + { + "name": "seeking", + "at": 2273 + }, + { + "name": "seeked", + "at": 2281 + }, + { + "name": "canplay", + "at": 2289 + }, + { + "name": "seeking", + "at": 7304 + }, + { + "name": "seeked", + "at": 7304 + }, + { + "name": "playing", + "at": 7480 + } + ], + "publicState": null, + "pageErrors": [] + } + ] + }, + { + "label": "engines", + "scope": "pure native media with direct correction enabled; Chromium and Firefox; one sample each", + "directory": "refactor/.cache/chapter05-native-engines-report", + "report": { + "path": "refactor/.cache/chapter05-native-engines-report/report.json", + "sha256": "8e42065b40584162932df5c3692c91abdb10c1a0dc77996d6efd3ebdf7433c6c" + }, + "stats": { + "startTime": "2026-09-14T17:46:57.627Z", + "duration": 6283.360000000001, + "expected": 2, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "exitCode": 0, + "log": { + "path": "refactor/.cache/chapter05-native-engines.log", + "sha256": "34fe9c0d009e1ea4ce7def09cf0a8eeee2bca25c230c05e1032c022d6cc1a178" + }, + "samples": [ + { + "ordinal": 1, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "chromium", + "browser": "153.0.8010.12", + "startTime": "2026-09-14T17:47:00.068Z", + "status": "passed", + "recordCount": 36, + "maxAccessMs": 0.19999998807907104, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.008, + "target": 3.008, + "corrections": 0, + "correctionMode": "direct", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 56.30000001192093 + }, + { + "name": "loadedmetadata", + "at": 64.90000003576279 + }, + { + "name": "loadeddata", + "at": 64.90000003576279 + }, + { + "name": "canplay", + "at": 64.90000003576279 + }, + { + "name": "playing", + "at": 242.30000001192093 + }, + { + "name": "pause", + "at": 641.7000000476837 + }, + { + "name": "seeking", + "at": 641.8000000119209 + }, + { + "name": "seeked", + "at": 645.1000000238419 + }, + { + "name": "canplay", + "at": 645.1000000238419 + }, + { + "name": "loadstart", + "at": 792.3000000119209 + }, + { + "name": "loadedmetadata", + "at": 796.7000000476837 + }, + { + "name": "loadeddata", + "at": 796.9000000357628 + }, + { + "name": "canplay", + "at": 796.9000000357628 + }, + { + "name": "seeking", + "at": 796.9000000357628 + }, + { + "name": "seeked", + "at": 805 + }, + { + "name": "canplay", + "at": 805.1000000238419 + }, + { + "name": "playing", + "at": 960 + } + ], + "publicState": null, + "pageErrors": [] + }, + { + "ordinal": 2, + "title": "native paused video restores position after quality URL replacement without ArtPlayer", + "engine": "firefox", + "browser": "155.0", + "startTime": "2026-09-14T17:47:00.003Z", + "status": "passed", + "recordCount": 36, + "maxAccessMs": 0, + "accessesOver20ms": [], + "heartbeatGapsOver500ms": [], + "position": { + "time": 3.008, + "target": 3.008, + "corrections": 0, + "correctionMode": "direct", + "paused": true, + "error": null, + "artplayerLoaded": false + }, + "nativeEvents": [ + { + "name": "loadstart", + "at": 322 + }, + { + "name": "loadedmetadata", + "at": 343 + }, + { + "name": "loadeddata", + "at": 348 + }, + { + "name": "canplay", + "at": 348 + }, + { + "name": "playing", + "at": 587 + }, + { + "name": "pause", + "at": 997 + }, + { + "name": "seeking", + "at": 1003 + }, + { + "name": "seeked", + "at": 1042 + }, + { + "name": "canplay", + "at": 1042 + }, + { + "name": "loadstart", + "at": 1164 + }, + { + "name": "loadedmetadata", + "at": 1171 + }, + { + "name": "loadeddata", + "at": 1175 + }, + { + "name": "canplay", + "at": 1175 + }, + { + "name": "seeking", + "at": 1175 + }, + { + "name": "seeked", + "at": 1213 + }, + { + "name": "canplay", + "at": 1213 + }, + { + "name": "playing", + "at": 1348 + } + ], + "publicState": null, + "pageErrors": [] + } + ] + } + ], + "conclusions": [ + "Default tracing and trace-off fixed series each retain one failure; tracing is not a necessary trigger in these samples.", + "No monitored native media property access exceeded 20 ms, while page heartbeat gaps around 5 seconds appeared in passed and failed samples.", + "Unassisted native metadata restoration reset the position near zero in all six WebKit controls.", + "All six directly corrected native controls restored their position; two show a roughly 5-second heartbeat gap without ArtPlayer loaded.", + "Deferred correction also leaves a 5.104-second heartbeat gap; no setTimeout workaround was adopted.", + "Same native direct-control entry passes Chromium/Firefox once each." + ], + "limitations": [ + "Property access instrumentation covers currentTime,duration,readyState,seeking,playbackRate,paused only; methods/layout/renderer/OS scheduling are not individually profiled.", + "Five-second gaps outside ArtPlayer do not prove the exact cause of every earlier ten-second timeout.", + "Each prospective series has a fixed repeat count and no failure retry; these are diagnostic samples, not statistical release certification.", + "Final helper adds a selector for the native page; correction and deferred control modes were added after their preceding preserved runs. No claim that final diagnostic source was identical across all controls.", + "Initial native failures retain their position assertion; not converted to expected passes or included in routine CI.", + "No production workaround, larger timeout, changed browser target, physical-device or remote CI acceptance." + ], + "defaultRegression": { + "report": "refactor/.cache/chapter05-timing-default-report/report.json", + "sha256": "b1d9ae3b47e9ff279f5315c74fe616a5fd87411ce44b0d4de1ee98f2febc8215", + "stats": { + "startTime": "2026-09-14T17:49:46.439Z", + "duration": 4778.524, + "expected": 1, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "result": { + "scope": "installed", + "exitCode": 0, + "signal": null, + "args": [ + "test", + "--config=playwright.installed.config.js", + "chapter-combinations.spec.js", + "--project=chromium", + "--workers=1", + "--grep=candidate core \\+ candidate chapter: quality switch" + ] + }, + "diagnosticAttachmentAbsent": true, + "scope": "One Chromium installed candidate/core Chapter quality switch, with diagnostic flag disabled" + } +} diff --git a/refactor/changes/2026-09-15-PKG-CHAPTER-05-native-timing.md b/refactor/changes/2026-09-15-PKG-CHAPTER-05-native-timing.md new file mode 100644 index 000000000..4365f586f --- /dev/null +++ b/refactor/changes/2026-09-15-PKG-CHAPTER-05-native-timing.md @@ -0,0 +1,80 @@ +# PKG-CHAPTER-05 原生时钟与纠正对照 + +进一步缩小 CHAPTER-TIMING-01 的范围,任务仍为 doing。没有修改核心或章节的 +生产代码,没有扩大测试超时。相似的五秒页面停顿已在未加载 ArtPlayer 的 video +对照中出现;尚未确认底层原因,也不能据此宣称每次章节超时都与核心无关。 + +## 诊断结构 + +`test/browser/chapter-timing.js` 在显式开关下包装实际 video 实例的六个属性: +currentTime、duration、readyState、seeking、playbackRate、paused。它转发真实 +原生 getter/setter 并记录前后页面时钟、返回值和异常,不替换媒体行为。最多保存 +10,000 条属性记录,同时保存不读取媒体属性的原生事件时间和 100 ms 心跳。 +本次所有样本均未达到记录上限。get/set 的记录本身会有开销,不能当作零干扰探针。 + +章节组合默认不启用探针;设置 ARTPLAYER_CHAPTER_TIMING_DIAGNOSTICS=1 才安装。 +afterEach 先停止心跳并保存附件,随后保留原有状态与销毁流程。记录/属性包装和 +原生监听器属于该测试页面,随 Playwright 的页面销毁释放,不进入播放器包。 + +`chapter-native-media.native.js` 使用不加载播放器脚本的独立 HTML,只放原生 +video 和播放/暂停/切换按钮;使用相同的 pattern.mp4、query 区分两个 URL, +保持媒体字节不变。它提供 metadata 时恢复、seeked 时一次纠正和下一任务纠正 +三种显式诊断模式,不改变生产实现。默认 `.native.js` 不纳入 source spec。 +独立 `playwright.chapter-native.config.js` 复用原引擎/断言/超时,新增 +`yarn test:chapter-native` 入口和独立输出目录;没有新增依赖或更换运行时。 + +## 固定序列结果 + +Windows、Node 24.21.0、Yarn 1.22.22、WebKit 26.6;每一组先固定次数再运行, +没有失败重试。既有安装组合使用 run-s8MkZT 已核验的 main,源码 HEAD 为 +a03e5acc500ceee13f79f438bd0533995f883eaa。 + +| 组别 | 通过 / 失败 | 页面心跳间隔 >500 ms 的样本 | +| --- | --- | --- | +| 新旧核心/章节四组合 × 3,默认 trace | 11 / 1 | 4 / 12 | +| 相同四组合 × 3,诊断时 trace=off | 11 / 1 | 7 / 12 | +| 原生 video,仅 metadata 恢复 × 6 | 0 / 6 | 0 / 6 | +| 原生 video,一次直接纠正 × 6 | 6 / 0 | 2 / 6 | +| 原生 video,一次下一任务纠正 × 6 | 6 / 0 | 1 / 6 | +| Chromium/Firefox 原生直接纠正入口各一次 | 2 / 0 | 0 / 2 | + +前两组被监测的原生属性访问最长分别为 1 ms、2 ms,但心跳出现约五秒空档, +失败样本连续出现两段。关闭 trace 仍复现,说明录制不是必要条件。停顿发生于 +这些被采样的属性访问之外;未分别测量原生方法、布局、媒体线程、GPU、OS 调度, +不能据此断言具体线程死锁或协议问题。 + +没有纠正的原生对照六次都回到接近零的位置,保留原位置断言失败,不改成成功。 +加入一次纠正后六次均回到约三秒、保持暂停并能继续播放,且确认 window.Artplayer +不存在;两次仍有约五秒心跳空档。下一任务纠正也有 5104 ms 空档,因此没有采用 +简单 setTimeout 作为核心修复。不能由小样本的数量差异推导某种模式更快或更可靠。 + +原始结果、错误、每例属性最大耗时、页面事件、心跳、位置与输入摘要见 +[机器记录](../baselines/chapter-native-timing-validation.json)。此前的十秒读取 +失败及本次失败均保留;后续须定位这些停顿与具体失败的因果关系。 + +## 复跑 + +先按 scripts/browser-validation/README.md 准备六包并设置安装 map。 + +```powershell +$env:ARTPLAYER_CHAPTER_TIMING_DIAGNOSTICS = '1' +yarn test:browser:installed chapter-combinations.spec.js --project=webkit --workers=2 --grep='quality switch' --repeat-each=3 +``` + +`--trace=off` 只用于独立诊断对照,不修改正式 CI。完成进程后先归档该输出目录, +再执行下一组。恢复默认组合测试前清除上述诊断环境变量。 + +```powershell +# 不带纠正:本次 Windows WebKit 因位置归零而失败的原生对照。 +$env:ARTPLAYER_NATIVE_QUALITY_CORRECTION = '' +yarn test:chapter-native --project=webkit --workers=2 --repeat-each=6 +# 一次同步纠正,或改为 deferred 测试下一任务纠正。 +$env:ARTPLAYER_NATIVE_QUALITY_CORRECTION = '1' +yarn test:chapter-native --project=webkit --workers=2 --repeat-each=6 +``` + +每组都会写 refactor/.cache/chapter-native;先等待原进程终止,再核对目录归属并 +归档,不能覆盖之前的失败。源码/工具后续变化要另记输入和结果,不套用旧报告。 +scoped lint、严格工具链和计划检查通过;原生入口两引擎运行通过。这不是完整 +章节/真机/发布验收,PKG-CHAPTER-05 与 CHAPTER-TIMING-01 继续开放。 +撤销本检查点只移除诊断工具和文档,不涉及生产产物回退。未推送、部署或发布。 diff --git a/refactor/plan.md b/refactor/plan.md index 173754a7d..f86070b65 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -539,7 +539,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) [记录](changes/2026-09-14-PKG-CHAPTER-05-timing.md) [记录](baselines/chapter-timing-observations.json) +- PKG-CHAPTER-05: [记录](changes/2026-09-12-PKG-CHAPTER-05-combinations.md) [记录](baselines/chapter-combinations-checkpoint.json) [记录](changes/2026-09-14-PKG-CHAPTER-05-timing.md) [记录](baselines/chapter-timing-observations.json) [记录](changes/2026-09-15-PKG-CHAPTER-05-native-timing.md) [记录](baselines/chapter-native-timing-validation.json) - PKG-AMBILIGHT-01: [记录](changes/2026-09-12-PKG-AMBILIGHT-01-contract.md) [记录](baselines/ambilight-contract.md) [记录](baselines/ambilight-release.json) [记录](baselines/ambilight-contract-validation.json) - PKG-AMBILIGHT-02: [记录](changes/2026-09-12-PKG-AMBILIGHT-02-tests.md) [记录](baselines/ambilight-behavior-validation.json) [记录](ambilight-validation.md) - PKG-AMBILIGHT-03: [记录](changes/2026-09-12-PKG-AMBILIGHT-03-lifecycle.md) [记录](ambilight-validation.md) [记录](baselines/ambilight-lifecycle-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index 18ecb93e3..184872177 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,13 @@ # 进度与证据 +## PKG-CHAPTER-05 原生时钟对照检查点 + +默认 trace 与关闭 trace 的两组固定 WebKit 安装组合均为 11/12 通过,保留失败。 +被监测媒体属性访问均很短,页面却出现约五秒空档。不加载 ArtPlayer 的原生 video +在一次位置纠正后 6/6 恢复,其中两次也有类似空档;延后纠正仍出现 5104 ms 空档, +因此未改核心或扩大超时。新增显式探针、独立原生入口和[复跑记录](changes/2026-09-15-PKG-CHAPTER-05-native-timing.md)。 +具体底层原因仍未确认,05/CHAPTER-TIMING-01 保持开放;任务完成数仍为 196/262。 + ## CI-01 Ads 接入安装矩阵,完整回归保留章节失败 六包统一 installed 范围实测 426 项:425 通过、1 项 WebKit 章节切画质等待失败; diff --git a/refactor/risks.json b/refactor/risks.json index e97ec6aa9..c3dfcc8cc 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -2918,11 +2918,13 @@ "refactor/changes/2026-09-14-PKG-CHAPTER-05-timing.md", "refactor/baselines/chapter-timing-observations.json", "refactor/baselines/ci-ads-installed-validation.json", - "refactor/changes/2026-09-15-CI-01-ads-installed.md" + "refactor/changes/2026-09-15-CI-01-ads-installed.md", + "refactor/changes/2026-09-15-PKG-CHAPTER-05-native-timing.md", + "refactor/baselines/chapter-native-timing-validation.json" ], "compatibleResolution": "记录原生事件和绝对/相对时序,进一步区分媒体驱动耗时、夹具和核心源操作;未证明原因前不改核心、不扩大超时或重复到绿灯。", "closureCriteria": "确认先前超时的来源并有对应可靠回归;后续单次通过不足以关闭。", - "workspaceState": "Six-package installed run: WebKit candidate/core Chapter failed after restart while waiting for non-seeking readyState>=2. A trace evaluation took 9939.104 ms and returned false; initial seeked had already fired, followed later by another seeking/canplay. This is a different observed phase from the previous restart timeout; common root cause remains unconfirmed. Keep both failures and investigate without relaxing timeouts." + "workspaceState": "Six-package installed run: WebKit candidate/core Chapter failed after restart while waiting for non-seeking readyState>=2. A trace evaluation took 9939.104 ms and returned false; initial seeked had already fired, followed later by another seeking/canplay. This is a different observed phase from the previous restart timeout; common root cause remains unconfirmed. Keep both failures and investigate without relaxing timeouts. Fixed diagnostic runs with/without trace each retain one WebKit combination failure, while observed native getters/setters remain <=2 ms and page heartbeats show roughly five-second gaps. A no-ArtPlayer native video control restores with one correction yet reproduces a similar five-second gap; deferring correction still shows 5104 ms. Exact cause and relation to each earlier ten-second failure remain unconfirmed; no production timer workaround adopted." }, { "id": "DASH-SDK-01", diff --git a/refactor/tasks.json b/refactor/tasks.json index a0bad9dc6..31abacec9 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -1447,7 +1447,9 @@ "changes/2026-09-12-PKG-CHAPTER-05-combinations.md", "baselines/chapter-combinations-checkpoint.json", "changes/2026-09-14-PKG-CHAPTER-05-timing.md", - "baselines/chapter-timing-observations.json" + "baselines/chapter-timing-observations.json", + "changes/2026-09-15-PKG-CHAPTER-05-native-timing.md", + "baselines/chapter-native-timing-validation.json" ] }, { diff --git a/test/browser/chapter-combinations.spec.js b/test/browser/chapter-combinations.spec.js index 3bffca5a3..e89cffcfa 100644 --- a/test/browser/chapter-combinations.spec.js +++ b/test/browser/chapter-combinations.spec.js @@ -1,5 +1,7 @@ +import process from 'node:process' import { devices } from '@playwright/test' import { hoverProgress } from './chapter-hover.ts' +import { installChapterTiming, readChapterTiming } from './chapter-timing.js' import { expect, test } from './fixtures.js' async function openChapter(page, core, chapter) { @@ -35,6 +37,8 @@ async function openChapter(page, core, chapter) { }) await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true) await expect(page.locator('.art-chapter')).toHaveCount(3) + if (process.env.ARTPLAYER_CHAPTER_TIMING_DIAGNOSTICS === '1') + await installChapterTiming(page) } async function hoverChapter(page, percentage, text) { @@ -80,6 +84,8 @@ async function waitForChapterRestart(page, testInfo) { } test.afterEach(async ({ page }, testInfo) => { + if (process.env.ARTPLAYER_CHAPTER_TIMING_DIAGNOSTICS === '1') + await readChapterTiming(page, testInfo) const state = await page.evaluate(() => ({ at: performance.now(), timeOrigin: performance.timeOrigin, diff --git a/test/browser/chapter-native-media.native.js b/test/browser/chapter-native-media.native.js new file mode 100644 index 000000000..e19c942c0 --- /dev/null +++ b/test/browser/chapter-native-media.native.js @@ -0,0 +1,81 @@ +import process from 'node:process' +import { installChapterTiming, readChapterTiming } from './chapter-timing.js' +import { expect, test } from './fixtures.js' + +test('native paused video restores position after quality URL replacement without ArtPlayer', async ({ page }, testInfo) => { + await page.route('**/chapter-native.html', route => route.fulfill({ contentType: 'text/html', body: '' })) + await page.goto('/chapter-native.html') + await installChapterTiming(page, '#media') + await page.evaluate((correctionMode) => { + const video = document.querySelector('#media') + video.muted = true + window.nativeRestarts = [] + document.querySelector('#play').onclick = () => video.play() + document.querySelector('#pause').onclick = () => video.pause() + document.querySelector('#quality').onclick = () => { + const time = video.currentTime + window.nativeRestoreTarget = time + window.nativeCorrections = 0 + window.nativeCorrectionMode = correctionMode + if (correctionMode !== 'none') { + video.addEventListener('seeked', () => { + if (!window.nativeCorrections && Math.abs(video.currentTime - time) > 0.05) { + window.nativeCorrections++ + if (correctionMode === 'deferred') { + setTimeout(() => { + video.currentTime = time + }, 0) + } + else { + video.currentTime = time + } + } + }) + } + video.addEventListener('loadedmetadata', () => { + video.currentTime = time + }, { once: true }) + video.addEventListener('loadeddata', () => { + window.nativeRestarts.push(video.currentSrc) + }, { once: true }) + video.src = '/test/pattern.mp4?quality=A' + } + video.src = '/test/pattern.mp4?quality=B' + }, process.env.ARTPLAYER_NATIVE_QUALITY_CORRECTION === 'deferred' ? 'deferred' : process.env.ARTPLAYER_NATIVE_QUALITY_CORRECTION === '1' ? 'direct' : 'none') + try { + await expect.poll(() => page.evaluate(() => document.querySelector('#media').readyState >= 2)).toBe(true) + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => document.querySelector('#media').currentTime)).toBeGreaterThan(0.2) + await page.locator('#pause').click() + await page.evaluate(() => { + document.querySelector('#media').currentTime = 3.008 + }) + await expect.poll(() => page.evaluate(() => !document.querySelector('#media').seeking)).toBe(true) + await page.locator('#quality').click() + await expect.poll(() => page.evaluate(() => window.nativeRestarts.length)).toBe(1) + await expect.poll(() => page.evaluate(() => { + const video = document.querySelector('#media') + return !video.seeking && video.readyState >= 2 + })).toBe(true) + const state = await page.evaluate(() => { + const video = document.querySelector('#media') + return { time: video.currentTime, target: window.nativeRestoreTarget, corrections: window.nativeCorrections, correctionMode: window.nativeCorrectionMode, paused: video.paused, error: video.error?.code || null, artplayerLoaded: typeof window.Artplayer !== 'undefined' } + }) + await testInfo.attach('native-quality-position', { contentType: 'application/json', body: JSON.stringify(state) }) + expect(state.artplayerLoaded).toBe(false) + expect(state.time).toBeCloseTo(state.target, 1) + expect(state.paused).toBe(true) + expect(state.error).toBeNull() + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => document.querySelector('#media').currentTime)).toBeGreaterThan(state.time + 0.2) + } + finally { + await readChapterTiming(page, testInfo) + await page.evaluate(() => { + const video = document.querySelector('#media') + video.pause() + video.removeAttribute('src') + video.load() + }) + } +}) diff --git a/test/browser/chapter-timing.js b/test/browser/chapter-timing.js new file mode 100644 index 000000000..ccd5f500f --- /dev/null +++ b/test/browser/chapter-timing.js @@ -0,0 +1,56 @@ +export async function installChapterTiming(page, selector) { + await page.evaluate((selector) => { + const video = selector ? document.querySelector(selector) : window.art.video + const records = [] + let sequence = 0 + const record = (value) => { + if (records.length < 10000) + records.push({ at: performance.now(), ...value }) + } + for (const name of ['currentTime', 'duration', 'readyState', 'seeking', 'playbackRate', 'paused']) { + const descriptor = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, name) + if (!descriptor?.get) + throw new Error(`Missing native media descriptor: ${name}`) + const access = (kind, callback, value) => { + const id = sequence++ + const start = performance.now() + record({ id, kind, name, phase: 'before', value }) + try { + const result = callback() + record({ id, kind, name, phase: 'after', value: result, elapsed: performance.now() - start }) + return result + } + catch (error) { + record({ id, kind, name, phase: 'error', error: String(error), elapsed: performance.now() - start }) + throw error + } + } + Object.defineProperty(video, name, { + configurable: true, + get() { return access('get', () => descriptor.get.call(this)) }, + ...(descriptor.set ? { set(value) { access('set', () => descriptor.set.call(this, value), value) } } : {}), + }) + } + const events = [] + for (const name of ['loadstart', 'loadedmetadata', 'loadeddata', 'canplay', 'seeking', 'seeked', 'playing', 'pause', 'error']) { + video.addEventListener(name, () => events.push({ name, at: performance.now() })) + } + const heartbeat = [] + let previous = performance.now() + const timer = setInterval(() => { + const at = performance.now() + heartbeat.push({ at, gap: at - previous }) + previous = at + }, 100) + window.chapterTiming = { records, events, heartbeat, started: previous, timeOrigin: performance.timeOrigin } + window.stopChapterTiming = () => clearInterval(timer) + }, selector) +} + +export async function readChapterTiming(page, testInfo) { + const observation = await page.evaluate(() => { + window.stopChapterTiming?.() + return window.chapterTiming || null + }).catch(error => ({ error: error.message })) + await testInfo.attach('chapter-native-access-timing', { contentType: 'application/json', body: JSON.stringify(observation) }) +}