Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/browser/dom-helpers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, unknown>;
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<string>;
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<string, unknown>;
g.__webcmd_xhr = [{ data: 'already here' }];
Expand Down
4 changes: 2 additions & 2 deletions src/browser/dom-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down