aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-25 23:16:14 -0700
committerAdam Soltys <[email protected]>2026-09-25 23:16:14 -0700
commit1c388b3897ddd36c07f70b2b7f28467fd169e924 (patch)
tree8b28f79721b7a3cbabf0e69cd601102b2f464dfa /tools
parent5511a1504e6496e8a2a100b6a6913c5e1eacf0de (diff)
downloadcoinosv3-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.js9
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();