Skip to content

Commit 873e5fb

Browse files
Resolve LCP if exists
1 parent 527b3f1 commit 873e5fb

File tree

3 files changed

+47
-15
lines changed

3 files changed

+47
-15
lines changed

injected/src/features/breakage-reporting.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ import { getExpandedPerformanceMetrics, getJsPerformanceMetrics } from './breaka
44
export default class BreakageReporting extends ContentFeature {
55
init() {
66
const isExpandedPerformanceMetricsEnabled = this.getFeatureSettingEnabled('expandedPerformanceMetrics', 'enabled');
7-
this.messaging.subscribe('getBreakageReportValues', () => {
7+
this.messaging.subscribe('getBreakageReportValues', async () => {
88
const jsPerformance = getJsPerformanceMetrics();
99
const referrer = document.referrer;
1010
const result = {
1111
jsPerformance,
1212
referrer,
1313
};
1414
if (isExpandedPerformanceMetricsEnabled) {
15-
const expandedPerformanceMetrics = getExpandedPerformanceMetrics();
15+
const expandedPerformanceMetrics = await getExpandedPerformanceMetrics();
1616
if (expandedPerformanceMetrics.success) {
1717
result.expandedPerformanceMetrics = expandedPerformanceMetrics.metrics;
1818
}

injected/src/features/breakage-reporting/utils.js

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,50 @@ function returnError(errorMessage) {
1919
return { error: errorMessage, success: false };
2020
}
2121

22+
/**
23+
* @returns {Promise<number | null>}
24+
*/
25+
function waitForLCP(timeoutMs = 500) {
26+
return new Promise((resolve) => {
27+
let timeoutId;
28+
let observer;
29+
30+
const cleanup = () => {
31+
if (observer) observer.disconnect();
32+
if (timeoutId) clearTimeout(timeoutId);
33+
};
34+
35+
// Set timeout
36+
timeoutId = setTimeout(() => {
37+
cleanup();
38+
resolve(null); // Resolve with null instead of hanging
39+
}, timeoutMs);
40+
41+
// Try to get existing LCP
42+
observer = new PerformanceObserver((list) => {
43+
const entries = list.getEntries();
44+
const lastEntry = entries[entries.length - 1];
45+
if (lastEntry) {
46+
cleanup();
47+
resolve(lastEntry.startTime);
48+
}
49+
});
50+
51+
try {
52+
observer.observe({ type: 'largest-contentful-paint', buffered: true });
53+
} catch (error) {
54+
// Handle browser compatibility issues
55+
cleanup();
56+
resolve(null);
57+
}
58+
});
59+
}
60+
2261
/**
2362
* Get the expanded performance metrics
24-
* @returns {ErrorObject | PerformanceMetricsResponse}
63+
* @returns {Promise<ErrorObject | PerformanceMetricsResponse>}
2564
*/
26-
export function getExpandedPerformanceMetrics() {
65+
export async function getExpandedPerformanceMetrics() {
2766
try {
2867
if (document.readyState !== 'complete') {
2968
return returnError('Document not ready');
@@ -38,15 +77,8 @@ export function getExpandedPerformanceMetrics() {
3877

3978
// Get largest contentful paint if available
4079
let largestContentfulPaint = null;
41-
if (
42-
window.PerformanceObserver &&
43-
PerformanceObserver.supportedEntryTypes &&
44-
PerformanceObserver.supportedEntryTypes.includes('largest-contentful-paint')
45-
) {
46-
const lcpEntries = performance.getEntriesByType('largest-contentful-paint');
47-
if (lcpEntries.length > 0) {
48-
largestContentfulPaint = lcpEntries[lcpEntries.length - 1].startTime;
49-
}
80+
if (PerformanceObserver.supportedEntryTypes.includes('largest-contentful-paint')) {
81+
largestContentfulPaint = await waitForLCP();
5082
}
5183

5284
// Calculate total resource sizes

injected/src/features/performance-metrics.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ export default class PerformanceMetrics extends ContentFeature {
2020
}
2121
}
2222

23-
triggerExpandedPerformanceMetrics() {
24-
const expandedPerformanceMetrics = getExpandedPerformanceMetrics();
23+
async triggerExpandedPerformanceMetrics() {
24+
const expandedPerformanceMetrics = await getExpandedPerformanceMetrics();
2525
this.messaging.notify('expandedPerformanceMetricsResult', expandedPerformanceMetrics);
2626
}
2727
}

0 commit comments

Comments
 (0)