[test](trx-frontend-http): watch the history progress from inside the page
The replay-progress check polled the overlay from the test every 100ms. A replay that starts and finishes between two polls is never sampled, and the test then reports that no progress was shown at all -- the source of the intermittent "no progress was shown while the history loaded" failure. Record the samples from a MutationObserver installed before the page's own scripts run, so a fast replay is observed rather than missed. Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -11,7 +11,7 @@ import assert from "node:assert/strict";
|
|||||||
import { chromium } from "playwright-core";
|
import { chromium } from "playwright-core";
|
||||||
import { startBrowser, startWebFixture } from "./web-fixture.mjs";
|
import { startBrowser, startWebFixture } from "./web-fixture.mjs";
|
||||||
|
|
||||||
/* global document, getComputedStyle, window, location */
|
/* global document, getComputedStyle, window, location, requestAnimationFrame, MutationObserver */
|
||||||
|
|
||||||
const VESSEL = {
|
const VESSEL = {
|
||||||
type: "ais", mmsi: 244660000, lat: 52.37, lon: 4.89, vessel_name: "NEDERLAND",
|
type: "ais", mmsi: 244660000, lat: 52.37, lon: 4.89, vessel_name: "NEDERLAND",
|
||||||
@@ -121,6 +121,27 @@ const historyFixture = await startWebFixture({
|
|||||||
});
|
});
|
||||||
const replay = await startBrowser(chromium);
|
const replay = await startBrowser(chromium);
|
||||||
|
|
||||||
|
// Installed before the page's own scripts, so nothing can be missed: every
|
||||||
|
// time the progress element becomes visible, its geometry is recorded.
|
||||||
|
await replay.page.addInitScript(() => {
|
||||||
|
window.__historyProgressSamples = [];
|
||||||
|
const watch = () => {
|
||||||
|
const element = document.getElementById("decode-history-overlay");
|
||||||
|
if (!element) { requestAnimationFrame(watch); return; }
|
||||||
|
const sample = () => {
|
||||||
|
if (element.classList.contains("is-hidden")) return;
|
||||||
|
const rect = element.getBoundingClientRect();
|
||||||
|
window.__historyProgressSamples.push({
|
||||||
|
width: Math.round(rect.width),
|
||||||
|
coversCentre: document.elementFromPoint(700, 450)?.id === "decode-history-overlay",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
new MutationObserver(sample).observe(element, { attributes: true, attributeFilter: ["class"] });
|
||||||
|
sample();
|
||||||
|
};
|
||||||
|
watch();
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await replay.page.setViewportSize({ width: 1400, height: 900 });
|
await replay.page.setViewportSize({ width: 1400, height: 900 });
|
||||||
await replay.page.goto(`${historyFixture.origin}/digital-modes`, { waitUntil: "domcontentloaded" });
|
await replay.page.goto(`${historyFixture.origin}/digital-modes`, { waitUntil: "domcontentloaded" });
|
||||||
@@ -128,20 +149,11 @@ try {
|
|||||||
|
|
||||||
// While it loads, the operator can still see the radio. This used to be a
|
// While it loads, the operator can still see the radio. This used to be a
|
||||||
// full-screen scrim over everything for as long as the replay ran.
|
// full-screen scrim over everything for as long as the replay ran.
|
||||||
const samples = [];
|
//
|
||||||
for (let attempt = 0; attempt < 30; attempt++) {
|
// Watched from inside the page rather than polled from here: a fast replay
|
||||||
samples.push(await replay.page.evaluate(() => {
|
// can start and finish between two polls, and then the test reports that no
|
||||||
const element = document.getElementById("decode-history-overlay");
|
// progress was ever shown when what happened is that it blinked.
|
||||||
if (!element || element.classList.contains("is-hidden")) return null;
|
const shown = await replay.page.evaluate(() => window.__historyProgressSamples ?? []);
|
||||||
const rect = element.getBoundingClientRect();
|
|
||||||
return {
|
|
||||||
width: Math.round(rect.width),
|
|
||||||
coversCentre: document.elementFromPoint(700, 450)?.id === "decode-history-overlay",
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
await replay.page.waitForTimeout(100);
|
|
||||||
}
|
|
||||||
const shown = samples.filter(Boolean);
|
|
||||||
assert.ok(shown.length > 0, "no progress was shown while the history loaded");
|
assert.ok(shown.length > 0, "no progress was shown while the history loaded");
|
||||||
for (const sample of shown) {
|
for (const sample of shown) {
|
||||||
assert.ok(sample.width < 700, `the progress covers ${sample.width}px of a 1400px page`);
|
assert.ok(sample.width < 700, `the progress covers ${sample.width}px of a 1400px page`);
|
||||||
|
|||||||
Reference in New Issue
Block a user