diff --git a/packages/core/src/utils/time.ts b/packages/core/src/utils/time.ts index bfed9386f8bb..1f1b4af1a434 100644 --- a/packages/core/src/utils/time.ts +++ b/packages/core/src/utils/time.ts @@ -125,9 +125,9 @@ function getBrowserTimeOrigin(): number | undefined { return navigationStart; } - // TODO: We should probably fall back to Date.now() - performance.now(), since this is still more accurate than just Date.now() (?) - // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date. - return dateNow; + // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to subtracting + // `performance.now()` from `Date.now()`. + return dateNow - performanceNow; } /** diff --git a/packages/core/test/lib/utils/time.test.ts b/packages/core/test/lib/utils/time.test.ts index e40c607cb409..585e0d5387d4 100644 --- a/packages/core/test/lib/utils/time.test.ts +++ b/packages/core/test/lib/utils/time.test.ts @@ -27,12 +27,12 @@ describe('browserPerformanceTimeOrigin', () => { vi.unstubAllGlobals(); }); - it('returns `Date.now()` if `performance.timeOrigin` is not reliable', async () => { + it('returns `Date.now() - performance.now()` if `performance.timeOrigin` is not reliable', async () => { const currentTimeMs = 1767778040866; const unreliableTime = currentTimeMs - RELIABLE_THRESHOLD_MS - 2_000; - const timeSincePageloadMs = 1_234.789; + const timeSincePageloadMs = 1_234.56789; vi.useFakeTimers(); vi.setSystemTime(new Date(currentTimeMs)); @@ -46,7 +46,29 @@ describe('browserPerformanceTimeOrigin', () => { }); const timeOrigin = await getFreshPerformanceTimeOrigin(); - expect(timeOrigin).toBe(1767778040866); + expect(timeOrigin).toBe(currentTimeMs - timeSincePageloadMs); + + vi.useRealTimers(); + vi.unstubAllGlobals(); + }); + + it('returns `Date.now() - performance.now()` if neither `performance.timeOrigin` nor `performance.timing.navigationStart` are available', async () => { + const currentTimeMs = 1767778040866; + + const timeSincePageloadMs = 1_234.56789; + + vi.useFakeTimers(); + vi.setSystemTime(new Date(currentTimeMs)); + vi.stubGlobal('performance', { + timeOrigin: undefined, + timing: { + navigationStart: undefined, + }, + now: () => timeSincePageloadMs, + }); + + const timeOrigin = await getFreshPerformanceTimeOrigin(); + expect(timeOrigin).toBe(currentTimeMs - timeSincePageloadMs); vi.useRealTimers(); vi.unstubAllGlobals();