Skip to content

Commit 1d25718

Browse files
jackfranklinDevtools-frontend LUCI CQ
authored andcommitted
RPP: update LargestImagePaintHandler to store by navigation ID
It is much easier if we store the data keyed by navigation ID rather than the entire object; in particular this is useful for insights that have the ID attached but not always the entire navigation. Bug: none Change-Id: Id63c5c3413897bfbdd290c7a2b5bd1995e0420a9 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6343230 Commit-Queue: Nancy Li <[email protected]> Reviewed-by: Nancy Li <[email protected]> Auto-Submit: Jack Franklin <[email protected]> Commit-Queue: Jack Franklin <[email protected]>
1 parent 7bc851d commit 1d25718

File tree

7 files changed

+25
-35
lines changed

7 files changed

+25
-35
lines changed

front_end/models/trace/handlers/LargestImagePaintHandler.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ describeWithEnvironment('LargestImagePaintHandler', function() {
1818
// There is only one main frame navigation in this trace.
1919
assert.lengthOf(mainFrameNavigations, 1);
2020
const mainNavigation = mainFrameNavigations.at(0);
21-
assert.isOk(mainNavigation);
21+
assert.isOk(mainNavigation?.args.data?.navigationId);
2222

23-
const {lcpRequestByNavigation} = parsedTrace.LargestImagePaint;
24-
const lcpRequest = lcpRequestByNavigation.get(mainNavigation);
23+
const {lcpRequestByNavigationId} = parsedTrace.LargestImagePaint;
24+
const lcpRequest = lcpRequestByNavigationId.get(mainNavigation.args.data?.navigationId);
2525
assert.isOk(lcpRequest);
2626
assert.strictEqual(lcpRequest.args.data.url, 'https://via.placeholder.com/2000.jpg');
2727
});
@@ -35,10 +35,10 @@ describeWithEnvironment('LargestImagePaintHandler', function() {
3535
// There is only one main frame navigation in this trace.
3636
assert.lengthOf(mainFrameNavigations, 1);
3737
const mainNavigation = mainFrameNavigations.at(0);
38-
assert.isOk(mainNavigation);
38+
assert.isOk(mainNavigation?.args.data?.navigationId);
3939

40-
const {lcpRequestByNavigation} = parsedTrace.LargestImagePaint;
41-
const lcpRequest = lcpRequestByNavigation.get(mainNavigation);
40+
const {lcpRequestByNavigationId} = parsedTrace.LargestImagePaint;
41+
const lcpRequest = lcpRequestByNavigationId.get(mainNavigation.args.data.navigationId);
4242
assert.isOk(lcpRequest);
4343
assert.strictEqual(lcpRequest.args.data.url, 'https://placehold.co/1000.jpg');
4444
});
@@ -50,10 +50,10 @@ describeWithEnvironment('LargestImagePaintHandler', function() {
5050
// There is only one main frame navigation in this trace.
5151
assert.lengthOf(mainFrameNavigations, 1);
5252
const mainNavigation = mainFrameNavigations.at(0);
53-
assert.isOk(mainNavigation);
53+
assert.isOk(mainNavigation?.args.data?.navigationId);
5454

55-
const {lcpRequestByNavigation} = parsedTrace.LargestImagePaint;
56-
const lcpRequest = lcpRequestByNavigation.get(mainNavigation);
55+
const {lcpRequestByNavigationId} = parsedTrace.LargestImagePaint;
56+
const lcpRequest = lcpRequestByNavigationId.get(mainNavigation.args.data.navigationId);
5757

5858
// There is a largest image paint event, but it happens after the LCP candidate
5959
// so it's ignored. The actual LCP is text.

front_end/models/trace/handlers/LargestImagePaintHandler.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import type {HandlerName} from './types.js';
3232
**/
3333
const imagePaintsByNodeIdAndProcess =
3434
new Map<Types.Events.ProcessID, Map<Protocol.DOM.BackendNodeId, Types.Events.LargestImagePaintCandidate>>();
35-
const lcpRequestByNavigation = new Map<Types.Events.NavigationStart|null, Types.Events.SyntheticNetworkRequest>();
35+
const lcpRequestByNavigationId = new Map<string, Types.Events.SyntheticNetworkRequest>();
3636

3737
export function reset(): void {
3838
imagePaintsByNodeIdAndProcess.clear();
@@ -90,17 +90,17 @@ export async function finalize(): Promise<void> {
9090
}
9191

9292
if (lcpRequest) {
93-
lcpRequestByNavigation.set(navigation, lcpRequest);
93+
lcpRequestByNavigationId.set(navigationId, lcpRequest);
9494
}
9595
}
9696
}
9797

9898
export interface LargestImagePaintData {
99-
lcpRequestByNavigation: Map<Types.Events.NavigationStart|null, Types.Events.SyntheticNetworkRequest>;
99+
lcpRequestByNavigationId: Map<string, Types.Events.SyntheticNetworkRequest>;
100100
}
101101

102102
export function data(): LargestImagePaintData {
103-
return {lcpRequestByNavigation};
103+
return {lcpRequestByNavigationId};
104104
}
105105

106106
export function deps(): HandlerName[] {

front_end/models/trace/insights/LCPDiscovery.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export function generateInsight(
121121
return finalize({warnings: [InsightWarning.NO_DOCUMENT_REQUEST]});
122122
}
123123

124-
const lcpRequest = parsedTrace.LargestImagePaint.lcpRequestByNavigation.get(context.navigation);
124+
const lcpRequest = parsedTrace.LargestImagePaint.lcpRequestByNavigationId.get(context.navigationId);
125125
if (!lcpRequest) {
126126
return finalize({lcpEvent});
127127
}

front_end/models/trace/insights/LCPPhases.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ export function generateInsight(
195195
const lcpMs = Helpers.Timing.microToMilli(metricScore.timing);
196196
// This helps position things on the timeline's UI accurately for a trace.
197197
const lcpTs = metricScore.event?.ts ? Helpers.Timing.microToMilli(metricScore.event?.ts) : undefined;
198-
const lcpRequest = parsedTrace.LargestImagePaint.lcpRequestByNavigation.get(context.navigation);
198+
const lcpRequest = parsedTrace.LargestImagePaint.lcpRequestByNavigationId.get(context.navigationId);
199199

200200
const docRequest = networkRequests.byTime.find(req => req.args.data.requestId === context.navigationId);
201201
if (!docRequest) {

front_end/models/trace/insights/RenderBlocking.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ function estimateSavingsWithGraphs(deferredIds: Set<string>, lanternContext: Lan
114114
}
115115

116116
function hasImageLCP(parsedTrace: Handlers.Types.ParsedTrace, context: InsightSetContextWithNavigation): boolean {
117-
return parsedTrace.LargestImagePaint.lcpRequestByNavigation.get(context.navigation) !== undefined;
117+
return parsedTrace.LargestImagePaint.lcpRequestByNavigationId.has(context.navigationId);
118118
}
119119

120120
function computeSavings(

front_end/panels/ai_assistance/data_formatters/PerformanceInsightFormatter.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,14 @@ function formatMicro(x: number|undefined): string {
2424
}
2525

2626
/**
27-
* For a given frame ID and navigation, returns the LCP Event and the LCP Request, if the resource was an image.
27+
* For a given frame ID and navigation ID, returns the LCP Event and the LCP Request, if the resource was an image.
2828
*/
29-
function getLCPData(
30-
parsedTrace: Trace.Handlers.Types.ParsedTrace, frameId: string, navigation: Trace.Types.Events.NavigationStart): {
29+
function getLCPData(parsedTrace: Trace.Handlers.Types.ParsedTrace, frameId: string, navigationId: string): {
3130
lcpEvent: Trace.Types.Events.LargestContentfulPaintCandidate,
3231
metricScore: Trace.Handlers.ModelHandlers.PageLoadMetrics.LCPMetricScore,
3332
lcpRequest?: Trace.Types.Events.SyntheticNetworkRequest,
3433
}|null {
35-
if (!navigation.args.data?.navigationId) {
36-
return null;
37-
}
38-
39-
const navMetrics =
40-
parsedTrace.PageLoadMetrics.metricScoresByFrameId.get(frameId)?.get(navigation.args.data?.navigationId);
34+
const navMetrics = parsedTrace.PageLoadMetrics.metricScoresByFrameId.get(frameId)?.get(navigationId);
4135
if (!navMetrics) {
4236
return null;
4337
}
@@ -53,7 +47,7 @@ function getLCPData(
5347

5448
return {
5549
lcpEvent,
56-
lcpRequest: parsedTrace.LargestImagePaint.lcpRequestByNavigation.get(navigation),
50+
lcpRequest: parsedTrace.LargestImagePaint.lcpRequestByNavigationId.get(navigationId),
5751
metricScore: metric,
5852
};
5953
}
@@ -74,15 +68,11 @@ export class PerformanceInsightFormatter {
7468
// No navigation ID = no LCP.
7569
return '';
7670
}
77-
const navigation = this.#parsedTrace.Meta.navigationsByNavigationId.get(this.#insight.navigationId);
78-
if (!navigation) {
79-
return '';
80-
}
81-
if (!this.#insight.frameId) {
71+
if (!this.#insight.frameId || !this.#insight.navigationId) {
8272
return '';
8373
}
8474

85-
const data = getLCPData(this.#parsedTrace, this.#insight.frameId, navigation);
75+
const data = getLCPData(this.#parsedTrace, this.#insight.frameId, this.#insight.navigationId);
8676
if (!data) {
8777
return '';
8878
}

front_end/testing/TraceHelpers.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ export function prettyPrint(
203203
indentation = 2, delimiter = ' ', prefix = '-', newline = '\n', out = ''): string {
204204
let skipped = false;
205205
return printNodes(tree.roots);
206-
function printNodes(nodes: Set<Trace.Helpers.TreeHelpers.TraceEntryNode>|
207-
Trace.Helpers.TreeHelpers.TraceEntryNode[]): string {
206+
function printNodes(nodes: Set<Trace.Helpers.TreeHelpers.TraceEntryNode>|Trace.Helpers.TreeHelpers.TraceEntryNode[]):
207+
string {
208208
for (const node of nodes) {
209209
const event = node.entry;
210210
if (!predicate(node, event)) {
@@ -690,7 +690,7 @@ export function getBaseTraceParseModelData(overrides: Partial<ParsedTrace> = {})
690690
timestampEvents: [],
691691
measureTraceByTraceId: new Map(),
692692
},
693-
LargestImagePaint: {lcpRequestByNavigation: new Map()},
693+
LargestImagePaint: {lcpRequestByNavigationId: new Map()},
694694
LargestTextPaint: new Map(),
695695
AuctionWorklets: {
696696
worklets: new Map(),

0 commit comments

Comments
 (0)