fix(web-probe): require visible mdtodo report preview
This commit is contained in:
@@ -1266,7 +1266,7 @@ async function waitForProjectManagementCommandReady(options = {}) {
|
|||||||
const needsTask = /\/tasks\//u.test(path);
|
const needsTask = /\/tasks\//u.test(path);
|
||||||
const taskReady = !needsTask || Boolean(last?.selectedTaskId || last?.selectedTaskRef?.hash || last?.taskBodyVisible === true || last?.launchButtonVisible === true);
|
const taskReady = !needsTask || Boolean(last?.selectedTaskId || last?.selectedTaskRef?.hash || last?.taskBodyVisible === true || last?.launchButtonVisible === true);
|
||||||
const needsReport = /\/reports\//u.test(path);
|
const needsReport = /\/reports\//u.test(path);
|
||||||
const reportReady = !needsReport || last?.reportPreviewVisible === true || last?.reportFullscreenVisible === true || Number(last?.reportLinkCount || 0) > 0;
|
const reportReady = !needsReport || last?.reportPreviewVisible === true || last?.reportFullscreenVisible === true;
|
||||||
if (baseReady && taskReady && reportReady) return { ok: true, reason: "project-management-command-ready", durationMs: Date.now() - started, snapshot: last, valuesRedacted: true };
|
if (baseReady && taskReady && reportReady) return { ok: true, reason: "project-management-command-ready", durationMs: Date.now() - started, snapshot: last, valuesRedacted: true };
|
||||||
await page.waitForTimeout(250).catch(() => {});
|
await page.waitForTimeout(250).catch(() => {});
|
||||||
}
|
}
|
||||||
@@ -2744,19 +2744,53 @@ async function openMdtodoReportPreview(command) {
|
|||||||
error.details = { beforeUrl, linkState, beforeProject, valuesRedacted: true };
|
error.details = { beforeUrl, linkState, beforeProject, valuesRedacted: true };
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
const responsePromise = page.waitForResponse((response) => {
|
const attempts = [];
|
||||||
|
let response = null;
|
||||||
|
let afterProject = null;
|
||||||
|
for (let attempt = 1; attempt <= 3; attempt += 1) {
|
||||||
|
const responsePromise = page.waitForResponse((item) => {
|
||||||
|
try {
|
||||||
|
const request = item.request();
|
||||||
|
return request.method().toUpperCase() === "GET" && new URL(item.url()).pathname === "/v1/project-management/mdtodo/report-preview";
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, { timeout: 10000 }).then((item) => ({ observed: true, status: item.status(), path: new URL(item.url()).pathname })).catch((error) => ({ observed: false, waitError: errorSummary(error) }));
|
||||||
|
const clickMode = attempt === 1 ? "normal" : "force";
|
||||||
|
let click = { ok: true, mode: clickMode, valuesRedacted: true };
|
||||||
|
await link.scrollIntoViewIfNeeded().catch(() => null);
|
||||||
try {
|
try {
|
||||||
const request = response.request();
|
if (attempt === 1) await link.click();
|
||||||
return request.method().toUpperCase() === "GET" && new URL(response.url()).pathname === "/v1/project-management/mdtodo/report-preview";
|
else await link.click({ force: true, timeout: 5000 });
|
||||||
} catch {
|
} catch (error) {
|
||||||
return false;
|
click = { ok: false, mode: clickMode, error: errorSummary(error), valuesRedacted: true };
|
||||||
|
await link.evaluate((element) => element.click()).catch(() => null);
|
||||||
}
|
}
|
||||||
}, { timeout: 30000 }).then((response) => ({ observed: true, status: response.status(), path: new URL(response.url()).pathname })).catch((error) => ({ observed: false, waitError: errorSummary(error) }));
|
await page.locator('[data-testid="mdtodo-report-preview"], [data-testid="mdtodo-report-error"]').first().waitFor({ state: "visible", timeout: 5000 }).catch(() => null);
|
||||||
await link.scrollIntoViewIfNeeded().catch(() => null);
|
afterProject = await projectManagementCommandSnapshot();
|
||||||
await link.click();
|
response = afterProject?.reportPreviewVisible === true
|
||||||
const response = await responsePromise;
|
? { observed: null, skippedAfterPreviewVisible: true, valuesRedacted: true }
|
||||||
await page.locator('[data-testid="mdtodo-report-preview"], [data-testid="mdtodo-report-error"]').first().waitFor({ state: "visible", timeout: 10000 }).catch(() => null);
|
: await responsePromise;
|
||||||
return { beforeUrl, afterUrl: currentPageUrl(), type: "openMdtodoReportPreview", selection, linkState, response, beforeProject, afterProject: await projectManagementCommandSnapshot(), pageId, valuesRedacted: true };
|
attempts.push({
|
||||||
|
attempt,
|
||||||
|
click,
|
||||||
|
response,
|
||||||
|
afterUrl: currentPageUrl(),
|
||||||
|
reportPreviewVisible: afterProject?.reportPreviewVisible === true,
|
||||||
|
reportErrorVisible: afterProject?.reportErrorVisible === true,
|
||||||
|
reportFullscreenVisible: afterProject?.reportFullscreenVisible === true,
|
||||||
|
valuesRedacted: true
|
||||||
|
});
|
||||||
|
if (afterProject?.reportPreviewVisible === true) break;
|
||||||
|
await page.waitForTimeout(700).catch(() => null);
|
||||||
|
}
|
||||||
|
afterProject = afterProject ?? await projectManagementCommandSnapshot();
|
||||||
|
if (afterProject?.reportPreviewVisible !== true) {
|
||||||
|
const error = new Error("openMdtodoReportPreview did not show markdown report preview");
|
||||||
|
error.details = { beforeUrl, afterUrl: currentPageUrl(), selection, linkState, response, attempts, beforeProject, afterProject, pageId, valuesRedacted: true };
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
return { beforeUrl, afterUrl: currentPageUrl(), type: "openMdtodoReportPreview", selection, linkState, response, attempts, beforeProject, afterProject, pageId, valuesRedacted: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
async function toggleMdtodoReportFullscreen(command) {
|
async function toggleMdtodoReportFullscreen(command) {
|
||||||
@@ -2977,6 +3011,7 @@ async function projectManagementCommandSnapshot(options = {}) {
|
|||||||
const launch = document.querySelector('[data-testid="mdtodo-workbench-launch"], [data-action="launch-workbench"]');
|
const launch = document.querySelector('[data-testid="mdtodo-workbench-launch"], [data-action="launch-workbench"]');
|
||||||
const bodyRendered = document.querySelector('[data-testid="mdtodo-body-rendered"]');
|
const bodyRendered = document.querySelector('[data-testid="mdtodo-body-rendered"]');
|
||||||
const reportPreview = document.querySelector('[data-testid="mdtodo-report-preview"]');
|
const reportPreview = document.querySelector('[data-testid="mdtodo-report-preview"]');
|
||||||
|
const reportError = document.querySelector('[data-testid="mdtodo-report-error"]');
|
||||||
const reportFullscreen = document.querySelector('[data-testid="mdtodo-report-fullscreen-dialog"]');
|
const reportFullscreen = document.querySelector('[data-testid="mdtodo-report-fullscreen-dialog"]');
|
||||||
const reportLinks = Array.from(document.querySelectorAll('[data-testid="mdtodo-report-link"]')).filter(visible);
|
const reportLinks = Array.from(document.querySelectorAll('[data-testid="mdtodo-report-link"]')).filter(visible);
|
||||||
return {
|
return {
|
||||||
@@ -3002,6 +3037,8 @@ async function projectManagementCommandSnapshot(options = {}) {
|
|||||||
reportLinkCount: reportLinks.length,
|
reportLinkCount: reportLinks.length,
|
||||||
reportPreviewVisible: visible(reportPreview),
|
reportPreviewVisible: visible(reportPreview),
|
||||||
reportPreviewText: visible(reportPreview) ? text(reportPreview) : "",
|
reportPreviewText: visible(reportPreview) ? text(reportPreview) : "",
|
||||||
|
reportErrorVisible: visible(reportError),
|
||||||
|
reportErrorText: visible(reportError) ? text(reportError) : "",
|
||||||
reportFullscreenVisible: visible(reportFullscreen),
|
reportFullscreenVisible: visible(reportFullscreen),
|
||||||
launchButtonVisible: visible(launch),
|
launchButtonVisible: visible(launch),
|
||||||
launchButtonEnabled: visible(launch) && !launch.disabled && launch.getAttribute("aria-disabled") !== "true",
|
launchButtonEnabled: visible(launch) && !launch.disabled && launch.getAttribute("aria-disabled") !== "true",
|
||||||
@@ -3044,6 +3081,8 @@ function sanitizeProjectCommandSnapshot(value) {
|
|||||||
taskBody: value.taskBodyText ? textDigest(value.taskBodyText, 200) : null,
|
taskBody: value.taskBodyText ? textDigest(value.taskBodyText, 200) : null,
|
||||||
reportPreviewText: undefined,
|
reportPreviewText: undefined,
|
||||||
reportPreview: value.reportPreviewText ? textDigest(value.reportPreviewText, 200) : null,
|
reportPreview: value.reportPreviewText ? textDigest(value.reportPreviewText, 200) : null,
|
||||||
|
reportErrorText: undefined,
|
||||||
|
reportError: value.reportErrorText ? textDigest(value.reportErrorText, 200) : null,
|
||||||
launchButtonTextHash: value.launchButtonText ? sha256Text(value.launchButtonText) : null,
|
launchButtonTextHash: value.launchButtonText ? sha256Text(value.launchButtonText) : null,
|
||||||
launchButtonTextPreview: value.launchButtonText ? truncate(value.launchButtonText, 80) : null,
|
launchButtonTextPreview: value.launchButtonText ? truncate(value.launchButtonText, 80) : null,
|
||||||
launchButtonText: undefined,
|
launchButtonText: undefined,
|
||||||
|
|||||||
Reference in New Issue
Block a user