From b96f0e0d03a0783abdeacbc19d5ccfcf7514ec57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Tue, 14 Jul 2026 09:28:33 +0000 Subject: [PATCH] fix(engine): ignore benign media request aborts --- .../engine/src/services/frameCapture.test.ts | 32 ++++++++++++++++++ packages/engine/src/services/frameCapture.ts | 33 ++++++++++++++++--- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/packages/engine/src/services/frameCapture.test.ts b/packages/engine/src/services/frameCapture.test.ts index 49e39c30bc..d271e2e731 100644 --- a/packages/engine/src/services/frameCapture.test.ts +++ b/packages/engine/src/services/frameCapture.test.ts @@ -7,6 +7,7 @@ import { formatRequestFailureDiagnostic, isFontResourceError, sanitizeDiagnosticUrl, + shouldIgnoreRequestFailureDiagnostic, } from "./frameCapture.js"; describe("isFontResourceError", () => { @@ -221,4 +222,35 @@ describe("navigation diagnostics", () => { }), ).toBe("[Browser:HTTP403] GET https://cdn.example.com/frame.png resource=image Forbidden"); }); + + it("ignores benign media aborts without hiding real request failures", () => { + expect( + shouldIgnoreRequestFailureDiagnostic({ + resourceType: "media", + url: "http://127.0.0.1:4173/assets/video.mp4", + failureText: "net::ERR_ABORTED", + }), + ).toBe(true); + expect( + shouldIgnoreRequestFailureDiagnostic({ + resourceType: "other", + url: "http://127.0.0.1:4173/assets/audio.oga?cache=1", + failureText: "net::ERR_ABORTED", + }), + ).toBe(true); + expect( + shouldIgnoreRequestFailureDiagnostic({ + resourceType: "media", + url: "http://127.0.0.1:4173/assets/video.mp4", + failureText: "net::ERR_FAILED", + }), + ).toBe(false); + expect( + shouldIgnoreRequestFailureDiagnostic({ + resourceType: "script", + url: "http://127.0.0.1:4173/assets/app.js", + failureText: "net::ERR_ABORTED", + }), + ).toBe(false); + }); }); diff --git a/packages/engine/src/services/frameCapture.ts b/packages/engine/src/services/frameCapture.ts index 7bd0cf4ce4..46aececcca 100644 --- a/packages/engine/src/services/frameCapture.ts +++ b/packages/engine/src/services/frameCapture.ts @@ -341,6 +341,27 @@ export function formatRequestFailureDiagnostic(input: { ); } +/** + * Chromium reports media loads that it intentionally cancels during probing as + * request failures. They are expected when the probe discovers or seeks local + * audio/video and do not indicate a missing asset. + */ +export function shouldIgnoreRequestFailureDiagnostic(input: { + resourceType: string; + url: string; + failureText: string; +}): boolean { + if (input.failureText !== "net::ERR_ABORTED") return false; + if (input.resourceType === "media") return true; + try { + return /\.(?:aac|flac|m4a|mp3|mp4|mov|oga|ogg|ogv|wav|webm)$/i.test( + new URL(input.url).pathname, + ); + } catch { + return false; + } +} + export function formatHttpErrorDiagnostic(input: { method: string; resourceType: string; @@ -1581,16 +1602,20 @@ export async function initializeSession(session: CaptureSession): Promise }); page.on("requestfailed", (request) => { - if (request.resourceType() === "script") { + const resourceType = request.resourceType(); + const url = request.url(); + const failureText = request.failure()?.errorText ?? "unknown"; + if (resourceType === "script") { recordScriptLoadFailure(session, request.url()); } + if (shouldIgnoreRequestFailureDiagnostic({ resourceType, url, failureText })) return; appendBrowserDiagnostic( session, formatRequestFailureDiagnostic({ method: request.method(), - resourceType: request.resourceType(), - url: request.url(), - failureText: request.failure()?.errorText ?? "unknown", + resourceType, + url, + failureText, }), ); });