aboutsummaryrefslogtreecommitdiffstats
path: root/tools/feed-stability-test.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-26 23:42:50 -0700
committerAdam Soltys <[email protected]>2026-09-26 23:42:50 -0700
commit93a95d1ce45d09cb833120cd61573fd88eb8ed26 (patch)
treeba08e857cac823647366ffa59e8d419694927161 /tools/feed-stability-test.js
parentb9226f695c827a4b16719fd0c752801f4e768e6c (diff)
downloadcoinosv3-93a95d1ce45d09cb833120cd61573fd88eb8ed26.tar.gz
coinosv3-93a95d1ce45d09cb833120cd61573fd88eb8ed26.zip
Media sources wait until the node is in the page; thumbnails use the cache.
Every render builds a fresh tree to diff against the live one, and a media element starts downloading the moment its src is set, even off the document: a sixteen-second feed scroll built 204 <video> and 1,416 <img> elements whose loads the morph then threw away — 375 cancelled video range requests, and full re-downloads from hosts that send no cache headers. h() now puts the source on data-lazy-src and it becomes src only once the node is in the page (render promotes it; a MutationObserver covers nodes appended by hand); the morph treats the two as one attribute. The thumbnail maker fetched every original with cache: 'reload' (38 MB in one scroll); the face was just painted from that URL, so the cache serves. holdScroll now recovers an anchor row that a large insert above pushed out of the window, from the height cache. Tests: the YouTube test accepts the in-view players autoplay loads; the stability test watches the notice for the catch-up, since the new rows land inside the window's spacer. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
Diffstat (limited to 'tools/feed-stability-test.js')
-rw-r--r--tools/feed-stability-test.js5
1 files changed, 4 insertions, 1 deletions
diff --git a/tools/feed-stability-test.js b/tools/feed-stability-test.js
index a176a0b..8b969f1 100644
--- a/tools/feed-stability-test.js
+++ b/tools/feed-stability-test.js
@@ -190,7 +190,10 @@ try {
Object.defineProperty(document, 'visibilityState', { value: 'visible', configurable: true });
document.dispatchEvent(new Event('visibilitychange'));
});
- await page.waitForFunction(() => document.querySelector('.notes-feed')?.innerText.includes('Large catch-up 24'), { timeout: 15000 });
+ // the new posts go in above the reader — inside the window's top spacer,
+ // not the DOM — so what shows is the notice counting them
+ try { await page.waitForFunction(() => parseInt((document.querySelector('.feed-new-pill')?.textContent || '0').replace(/\D/g, ''), 10) >= 25, { timeout: 15000 }); }
+ catch (e) { console.log(' catch-up did not surface:', JSON.stringify(await page.evaluate(() => ({ pill: document.querySelector('.feed-new-pill')?.textContent || null, rows: document.querySelectorAll('.notes-feed > .row').length, h: document.documentElement.scrollHeight, y: scrollY, top: document.querySelector('[data-key="win-top"]')?.offsetHeight || 0, first: document.querySelector('.notes-feed > .row')?.innerText.slice(0, 40), catchupLeft: (window.__catchup || []).length, reqs: (window.__feedRequests || []).length }))), errors.slice(0, 3)); }
const after = (await snapshot()).find((r) => r.id === before.id);
check('a large catch-up preserves the reading position', !!after && Math.abs(after.top - before.top) <= 1, JSON.stringify({ before: before.top, after: after?.top }));
// Start on the wallet and let its small background warm-up finish. The