From 9312049c8b79f8761d854048e0a183f55b61651c Mon Sep 17 00:00:00 2001 From: AcidicSoil Date: Fri, 4 Sep 2026 19:27:05 -0500 Subject: [PATCH] fix(browser): use monotonic capture timeout --- src/browser/dom-helpers.test.ts | 19 +++++++++++++++++++ src/browser/dom-helpers.ts | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/browser/dom-helpers.test.ts b/src/browser/dom-helpers.test.ts index bf644783..1acd859a 100644 --- a/src/browser/dom-helpers.test.ts +++ b/src/browser/dom-helpers.test.ts @@ -49,6 +49,25 @@ describe('waitForCaptureJs', () => { delete g.window; }); + it('uses monotonic elapsed time when the wall clock jumps forward', async () => { + const g = globalThis as unknown as Record; + const captured: unknown[] = []; + const originalDateNow = Date.now; + let calls = 0; + g.__webcmd_xhr = captured; + g.window = g; + Date.now = () => (calls++ === 0 ? 0 : 60_000); + try { + const promise = eval(waitForCaptureJs(200)) as Promise; + setTimeout(() => captured.push({ data: 'late after wall-clock jump' }), 20); + await expect(promise).resolves.toBe('captured'); + } finally { + Date.now = originalDateNow; + delete g.__webcmd_xhr; + delete g.window; + } + }); + it('resolves immediately when __webcmd_xhr already has data', async () => { const g = globalThis as unknown as Record; g.__webcmd_xhr = [{ data: 'already here' }]; diff --git a/src/browser/dom-helpers.ts b/src/browser/dom-helpers.ts index 3453e7b2..ce8a1e26 100644 --- a/src/browser/dom-helpers.ts +++ b/src/browser/dom-helpers.ts @@ -213,10 +213,10 @@ export function waitForDomStableJs(maxMs: number, quietMs: number): string { export function waitForCaptureJs(maxMs: number): string { return ` new Promise((resolve, reject) => { - const deadline = Date.now() + ${maxMs}; + const deadline = performance.now() + ${maxMs}; const check = () => { if ((window.__webcmd_xhr || []).length > 0) return resolve('captured'); - if (Date.now() > deadline) return reject(new Error('No network capture within ${maxMs / 1000}s')); + if (performance.now() > deadline) return reject(new Error('No network capture within ${maxMs / 1000}s')); setTimeout(check, 100); }; check();