aboutsummaryrefslogtreecommitdiffstats
path: root/tools/video-tap-test.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/video-tap-test.js')
-rw-r--r--tools/video-tap-test.js35
1 files changed, 26 insertions, 9 deletions
diff --git a/tools/video-tap-test.js b/tools/video-tap-test.js
index afa014e..f82238b 100644
--- a/tools/video-tap-test.js
+++ b/tools/video-tap-test.js
@@ -1,7 +1,8 @@
-// Tapping a feed video: anywhere on the picture (not the player's own play
-// button or control bar) goes full screen — the corner button is a reach on
-// a phone. Full screen, a tap pauses a playing clip; a tap on a paused one
-// comes back out. Taps on the controls stay the player's.
+// Tapping a video: in the feed it opens the media pager (feed-video-pager-
+// test.js has the rest). In a thread, anywhere on the picture (not the
+// player's own play button or control bar) goes full screen — the corner
+// button is a reach on a phone. Full screen, a tap pauses a playing clip; a
+// tap on a paused one comes back out. Taps on the controls stay the player's.
// Run: bun tools/video-tap-test.js
import puppeteer from './puppeteer.js';
import { cacheKeyFor } from '../src/wallet.js';
@@ -34,12 +35,12 @@ const errs = [];
page.on('pageerror', (e) => errs.push(String(e)));
const click = (t) => page.evaluate((x) => { const e = [...document.querySelectorAll('button')].find((n) => n.textContent.trim().toLowerCase().includes(x)); if (e) { e.click(); return true; } return false; }, t);
const waitText = async (x, ms = 25000) => { for (let i = 0; i < ms / 250; i++) { if ((await page.evaluate(() => document.body.innerText)).toLowerCase().includes(x)) return true; await sleep(250); } return false; };
-const st = () => page.evaluate(() => { const v = document.querySelector('video.note-video'); return { fs: document.fullscreenElement === v, paused: v.paused, controls: v.controls, thread: !document.querySelector('video.note-video')?.isConnected }; });
+const st = () => page.evaluate(() => { const v = document.querySelector('.thread-card video.note-video') || document.querySelector('video.note-video'); return { fs: document.fullscreenElement === v, paused: v.paused, controls: v.controls, thread: !document.querySelector('video.note-video')?.isConnected }; });
// tap the clip at a fraction of its box (or of the screen, full screen)
const tap = async (fx, fy) => {
const fs = await page.evaluate(() => !!document.fullscreenElement);
const r = fs ? { x: 0, y: 0, width: await page.evaluate(() => innerWidth), height: await page.evaluate(() => innerHeight) }
- : await page.evaluate(() => { const b = document.querySelector('video.note-video').getBoundingClientRect(); return { x: b.x, y: b.y, width: b.width, height: b.height }; });
+ : await page.evaluate(() => { const b = (document.querySelector('.thread-card video.note-video') || document.querySelector('video.note-video')).getBoundingClientRect(); return { x: b.x, y: b.y, width: b.width, height: b.height }; });
await page.mouse.click(r.x + r.width * fx, r.y + r.height * fy);
await sleep(700);
};
@@ -69,16 +70,32 @@ try {
check('the clip autoplays in the feed', !(await st()).paused);
await tap(0.2, 0.3);
+ check('in the feed, a tap opens the media pager', await page.evaluate(() => !!document.querySelector('.media-pager.videos')));
+ await page.keyboard.press('Escape'); await sleep(700);
+ check('...which Escape closes', await page.evaluate(() => !document.querySelector('.media-pager') && !document.fullscreenElement));
+ // the thread: the post's words open it
+ const words = await page.evaluate(() => {
+ const w = document.createTreeWalker(document.querySelector('.notes-feed'), NodeFilter.SHOW_TEXT);
+ for (let n; (n = w.nextNode());) if (n.textContent.includes('watch this')) { const r = document.createRange(); r.selectNodeContents(n); const b = r.getBoundingClientRect(); return { x: b.x + 10, y: b.y + b.height / 2 }; }
+ return null;
+ });
+ await page.mouse.click(words.x, words.y);
+ for (let i = 0; i < 40 && !(await page.evaluate(() => !!document.querySelector('.thread-card video.note-video'))); i++) await sleep(250);
+ check('the thread is open', await page.evaluate(() => !!document.querySelector('.thread-card video.note-video')));
+ await page.evaluate(() => document.querySelector('.thread-card video.note-video').scrollIntoView({ block: 'center' })); await sleep(300);
+ await page.evaluate(() => document.querySelector('.thread-card video.note-video').play().catch(() => {}));
+ for (let i = 0; i < 40 && (await st()).paused; i++) await sleep(250);
+ await tap(0.2, 0.3);
let s = await st();
- check('a tap on the picture goes full screen', s.fs, JSON.stringify(s));
- check('...without opening the thread', !s.thread);
+ check('in a thread, a tap on the picture goes full screen', s.fs, JSON.stringify(s));
+ check('...and not the pager', await page.evaluate(() => !document.querySelector('.media-pager')));
await tap(0.25, 0.3);
s = await st();
check('full screen, a tap pauses the playing clip', s.fs && s.paused, JSON.stringify(s));
await tap(0.5, 0.5);
s = await st();
check('a tap on the paused clip\'s play button is left to the player', s.fs, JSON.stringify(s));
- await page.evaluate(() => document.querySelector('video.note-video').pause()); await sleep(300);
+ await page.evaluate(() => document.querySelector('.thread-card video.note-video').pause()); await sleep(300);
await tap(0.2, 0.3);
s = await st();
check('a tap elsewhere on the paused clip comes out of full screen', !s.fs, JSON.stringify(s));