diff options
| author | Adam Soltys <[email protected]> | 2026-09-25 23:16:14 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-09-25 23:16:14 -0700 |
| commit | 1c388b3897ddd36c07f70b2b7f28467fd169e924 (patch) | |
| tree | 8b28f79721b7a3cbabf0e69cd601102b2f464dfa /tools | |
| parent | 5511a1504e6496e8a2a100b6a6913c5e1eacf0de (diff) | |
| download | coinosv3-1c388b3897ddd36c07f70b2b7f28467fd169e924.tar.gz coinosv3-1c388b3897ddd36c07f70b2b7f28467fd169e924.zip | |
Feed: cached posts paint at once, never a spinner over them; the chat home prefetches the feed.
The boot gate hid everything, cached posts included, until the opening
page's faces and pictures had decoded — seconds of spinner on a feed we
already held. Cached rows now paint immediately as they are and take their
prepared presentation once the warm-up lands (the container carries
data-booting meanwhile). The relay fetch starts at once instead of after
the warm-up; arrivals still wait at the door. Opening the chat home warms
and refreshes the current feed, so the Feed tap opens on the latest posts.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/feed-stability-test.js | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/tools/feed-stability-test.js b/tools/feed-stability-test.js index a1b3a1e..a176a0b 100644 --- a/tools/feed-stability-test.js +++ b/tools/feed-stability-test.js @@ -113,10 +113,13 @@ try { await page.waitForSelector('.item'); await page.evaluate(() => [...document.querySelectorAll('.item')].find((e) => /feed/i.test(e.textContent))?.click()); await sleep(1000); - check('cached rows wait for their slow avatar', !(await page.$('.notes-feed > .row'))); + // Cached posts paint at once — never a spinner over posts we hold — and + // settle into their prepared presentation once faces and pictures are in. + check('cached rows paint at once, before their slow avatar has loaded', !!(await page.$('.notes-feed[data-booting] > .row'))); + await page.waitForSelector('.notes-feed:not([data-booting]) > .row', { timeout: 15000 }); await page.waitForSelector(row(seeded[0].id), { timeout: 15000 }); - check('quoted note and mention resolved before admission', await page.$eval(row(seeded[1].id), (n) => n.innerText.includes('Quoted content') && n.innerText.includes('@Mentioned Person'))); - check('all five gallery images decoded before admission', await page.$eval(row(seeded[8].id), (n) => n.querySelectorAll('.note-img').length === 5 && [...n.querySelectorAll('.note-img')].every((i) => i.complete && i.naturalWidth > 0))); + check('quoted note and mention resolved once settled', await page.$eval(row(seeded[1].id), (n) => n.innerText.includes('Quoted content') && n.innerText.includes('@Mentioned Person'))); + check('all five gallery images decoded once settled', await page.$eval(row(seeded[8].id), (n) => n.querySelectorAll('.note-img').length === 5 && [...n.querySelectorAll('.note-img')].every((i) => i.complete && i.naturalWidth > 0))); check('the next page was prefetched before scrolling', requested.has('/next.png')); check('an unavailable image remains a usable link', await page.$eval(row(seeded[3].id), (n) => !n.querySelector('img.note-img') && !!n.querySelector('a[href$="/late.png"]'))); const initial = await snapshot(); |
