Skip to content

Commit 74414ab

Browse files
committed
ref(core): Remove dependence between performance.timeorigin and performance.timing.navigationStart
1 parent e32955f commit 74414ab

2 files changed

Lines changed: 17 additions & 45 deletions

File tree

packages/core/src/utils/time.ts

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,14 @@ let cachedTimeOrigin: number | undefined;
7878

7979
/**
8080
* Gets the time origin and the mode used to determine it.
81+
*
82+
* Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or
83+
* performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin
84+
* data as reliable if they are within a reasonable threshold of the current time.
85+
*
8186
* TODO: move to `@sentry/browser-utils` package.
8287
*/
8388
function getBrowserTimeOrigin(): number | undefined {
84-
// Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or
85-
// performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin
86-
// data as reliable if they are within a reasonable threshold of the current time.
8789
const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;
8890
if (!performance?.now) {
8991
return undefined;
@@ -94,11 +96,13 @@ function getBrowserTimeOrigin(): number | undefined {
9496
const performanceNow = performance.now();
9597
const dateNow = Date.now();
9698

97-
// if timeOrigin isn't available set delta to threshold so it isn't used
98-
const timeOriginDelta = performance.timeOrigin
99-
? Math.abs(performance.timeOrigin + performanceNow - dateNow)
100-
: threshold;
101-
const timeOriginIsReliable = timeOriginDelta < threshold;
99+
const timeOrigin = performance.timeOrigin;
100+
if (typeof timeOrigin === 'number') {
101+
const timeOriginDelta = Math.abs(timeOrigin + performanceNow - dateNow);
102+
if (timeOriginDelta < threshold) {
103+
return timeOrigin;
104+
}
105+
}
102106

103107
// TODO: Remove all code related to `performance.timing.navigationStart` once we drop support for Safari 14.
104108
// `performance.timeSince` is available in Safari 15.
@@ -111,18 +115,11 @@ function getBrowserTimeOrigin(): number | undefined {
111115
// Date API.
112116
// eslint-disable-next-line deprecation/deprecation
113117
const navigationStart = performance.timing?.navigationStart;
114-
const hasNavigationStart = typeof navigationStart === 'number';
115-
// if navigationStart isn't available set delta to threshold so it isn't used
116-
const navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;
117-
const navigationStartIsReliable = navigationStartDelta < threshold;
118-
119-
// TODO: Since timeOrigin explicitly replaces navigationStart, we should probably remove the navigationStartIsReliable check.
120-
if (timeOriginIsReliable && timeOriginDelta <= navigationStartDelta) {
121-
return performance.timeOrigin;
122-
}
123-
124-
if (navigationStartIsReliable) {
125-
return navigationStart;
118+
if (typeof navigationStart === 'number') {
119+
const navigationStartDelta = Math.abs(navigationStart + performanceNow - dateNow);
120+
if (navigationStartDelta < threshold) {
121+
return navigationStart;
122+
}
126123
}
127124

128125
// TODO: We should probably fall back to Date.now() - performance.now(), since this is still more accurate than just Date.now() (?)

packages/core/test/lib/utils/time.test.ts

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -77,29 +77,4 @@ describe('browserPerformanceTimeOrigin', () => {
7777
vi.useRealTimers();
7878
vi.unstubAllGlobals();
7979
});
80-
81-
it('returns `performance.timing.navigationStart` if `performance.timeOrigin` is less reliable', async () => {
82-
const currentTimeMs = 1767778040874;
83-
84-
const navigationStartMs = currentTimeMs - 2_000;
85-
86-
const timeSincePageloadMs = 1_234.789;
87-
88-
vi.useFakeTimers();
89-
vi.setSystemTime(new Date(currentTimeMs));
90-
91-
vi.stubGlobal('performance', {
92-
timeOrigin: navigationStartMs - 1,
93-
timing: {
94-
navigationStart: navigationStartMs,
95-
},
96-
now: () => timeSincePageloadMs,
97-
});
98-
99-
const timeOrigin = await getFreshPerformanceTimeOrigin();
100-
expect(timeOrigin).toBe(navigationStartMs);
101-
102-
vi.useRealTimers();
103-
vi.unstubAllGlobals();
104-
});
10580
});

0 commit comments

Comments
 (0)