diff --git a/packages/integration-tests/utils/replayEventTemplates.ts b/packages/integration-tests/utils/replayEventTemplates.ts index 6a86ef8f45c7..17aa903a0391 100644 --- a/packages/integration-tests/utils/replayEventTemplates.ts +++ b/packages/integration-tests/utils/replayEventTemplates.ts @@ -91,7 +91,7 @@ export const expectedLCPPerformanceSpan = { startTimestamp: expect.any(Number), endTimestamp: expect.any(Number), data: { - duration: expect.any(Number), + value: expect.any(Number), nodeId: expect.any(Number), size: expect.any(Number), }, diff --git a/packages/replay/src/util/createPerformanceEntries.ts b/packages/replay/src/util/createPerformanceEntries.ts index f90dc7d0af32..333a7fe5d809 100644 --- a/packages/replay/src/util/createPerformanceEntries.ts +++ b/packages/replay/src/util/createPerformanceEntries.ts @@ -104,17 +104,29 @@ function createResourceEntry(entry: PerformanceResourceTiming) { // TODO: type definition! // eslint-disable-next-line @typescript-eslint/explicit-function-return-type function createLargestContentfulPaint(entry: PerformanceEntry & { size: number; element: Node }) { - const { duration, entryType, startTime, size } = entry; + const { entryType, startTime, size } = entry; - const start = getAbsoluteTime(startTime); + let startTimeOrNavigationActivation = 0; + + if (WINDOW.performance) { + const navEntry = WINDOW.performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming & { + activationStart: number; + }; + + // See https://github.com/GoogleChrome/web-vitals/blob/9f11c4c6578fb4c5ee6fa4e32b9d1d756475f135/src/lib/getActivationStart.ts#L21 + startTimeOrNavigationActivation = (navEntry && navEntry.activationStart) || 0; + } + + const start = getAbsoluteTime(startTimeOrNavigationActivation); + const value = Math.max(startTime - startTimeOrNavigationActivation, 0); return { type: entryType, name: entryType, start, - end: start + duration, + end: start + value, data: { - duration, + value, size, // Not sure why this errors, Node should be correct (Argument of type 'Node' is not assignable to parameter of type 'INode') // eslint-disable-next-line @typescript-eslint/no-explicit-any