Skip to content

Commit 637aeb8

Browse files
Connor ClarkDevtools-frontend LUCI CQ
authored andcommitted
[RPP] Linkify using source maps for enhanced traces
The linkifying done for bottom-up/call-tree tables only tried to use source maps if the trace is fresh, as otherwise script ids are not accurate. However, they are accurate for enhanced traces, so I added support for that too. Unrelated to this change, I also added an error event listener to Worker.ts to log when a worker fails to load. This would have saved me a couple hours of debugging. Fixed: 432044399 Change-Id: I23ff59fe9209b6ac3a3f50c1ea009ba2df802e65 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7046248 Commit-Queue: Paul Irish <[email protected]> Reviewed-by: Paul Irish <[email protected]> Auto-Submit: Connor Clark <[email protected]>
1 parent 666a967 commit 637aeb8

File tree

5 files changed

+27
-20
lines changed

5 files changed

+27
-20
lines changed

front_end/core/common/Worker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ export class WorkerWrapper {
1111
this.#workerPromise = new Promise((fulfill, reject) => {
1212
this.#rejectWorkerPromise = reject;
1313
const worker = new Worker(workerLocation, {type: 'module'});
14+
worker.onerror = event => {
15+
console.error(`Failed to load worker for ${workerLocation.href}:`, event);
16+
};
1417
worker.onmessage = (event: MessageEvent<unknown>) => {
1518
console.assert(event.data === 'workerReady');
1619
worker.onmessage = null;

front_end/panels/timeline/TimelineTreeView.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -799,9 +799,9 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode<Gri
799799
const parsedTrace = this.treeView.parsedTrace();
800800
const target = parsedTrace ? targetForEvent(parsedTrace, event) : null;
801801
const linkifier = this.treeView.linkifier;
802-
const isFreshRecording =
803-
Boolean(parsedTrace && Tracing.FreshRecording.Tracker.instance().recordingIsFresh(parsedTrace));
804-
this.linkElement = TimelineUIUtils.linkifyTopCallFrame(event, target, linkifier, isFreshRecording);
802+
const isFreshOrEnhanced =
803+
Boolean(parsedTrace && Tracing.FreshRecording.Tracker.instance().recordingIsFreshOrEnhanced(parsedTrace));
804+
this.linkElement = TimelineUIUtils.linkifyTopCallFrame(event, target, linkifier, isFreshOrEnhanced);
805805
if (this.linkElement) {
806806
container.createChild('div', 'activity-link').appendChild(this.linkElement);
807807
}

front_end/panels/timeline/TimelineUIUtils.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ describeWithMockConnection('TimelineUIUtils', function() {
189189
url: 'https://google.com/test.js',
190190
lineNumber: 0,
191191
columnNumber: 0,
192-
isFreshRecording: true,
192+
isFreshOrEnhanced: true,
193193
target,
194194
linkifier,
195195
});

front_end/panels/timeline/TimelineUIUtils.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ interface LinkifyLocationOptions {
493493
lineNumber: number;
494494
target: SDK.Target.Target|null;
495495
linkifier: LegacyComponents.Linkifier.Linkifier;
496-
isFreshRecording?: boolean;
496+
isFreshOrEnhanced?: boolean;
497497
columnNumber?: number;
498498
omitOrigin?: boolean;
499499
}
@@ -656,7 +656,7 @@ export class TimelineUIUtils {
656656

657657
static async buildDetailsNodeForTraceEvent(
658658
event: Trace.Types.Events.Event, target: SDK.Target.Target|null, linkifier: LegacyComponents.Linkifier.Linkifier,
659-
isFreshRecording = false, parsedTrace: Trace.TraceModel.ParsedTrace): Promise<Node|null> {
659+
isFreshOrEnhanced = false, parsedTrace: Trace.TraceModel.ParsedTrace): Promise<Node|null> {
660660
let details: HTMLElement|HTMLSpanElement|(Element | null)|Text|null = null;
661661
let detailsText;
662662
// TODO(40287735): update this code with type-safe data checks.
@@ -706,7 +706,7 @@ export class TimelineUIUtils {
706706
lineNumber: callFrame?.lineNumber || 0,
707707
columnNumber: callFrame?.columnNumber,
708708
target,
709-
isFreshRecording,
709+
isFreshOrEnhanced,
710710
linkifier,
711711
omitOrigin: true,
712712
});
@@ -725,7 +725,7 @@ export class TimelineUIUtils {
725725
lineNumber: 0,
726726
columnNumber: 0,
727727
target,
728-
isFreshRecording,
728+
isFreshOrEnhanced,
729729
linkifier,
730730
});
731731
break;
@@ -743,7 +743,7 @@ export class TimelineUIUtils {
743743
lineNumber: lineNumber || 0,
744744
columnNumber: 0,
745745
target,
746-
isFreshRecording,
746+
isFreshOrEnhanced,
747747
linkifier,
748748
omitOrigin: true,
749749
});
@@ -761,7 +761,7 @@ export class TimelineUIUtils {
761761
lineNumber: 0,
762762
columnNumber: 0,
763763
target,
764-
isFreshRecording,
764+
isFreshOrEnhanced,
765765
linkifier,
766766
omitOrigin: true,
767767
});
@@ -779,7 +779,7 @@ export class TimelineUIUtils {
779779
Trace.Types.Events.isProfileCall(event)) {
780780
detailsText = null;
781781
} else {
782-
details = this.linkifyTopCallFrame(event, target, linkifier, isFreshRecording) ?? null;
782+
details = this.linkifyTopCallFrame(event, target, linkifier, isFreshOrEnhanced) ?? null;
783783
}
784784
break;
785785
}
@@ -792,7 +792,7 @@ export class TimelineUIUtils {
792792
}
793793

794794
static linkifyLocation(linkifyOptions: LinkifyLocationOptions): Element|null {
795-
const {scriptId, url, lineNumber, columnNumber, isFreshRecording, linkifier, target, omitOrigin} = linkifyOptions;
795+
const {scriptId, url, lineNumber, columnNumber, isFreshOrEnhanced, linkifier, target, omitOrigin} = linkifyOptions;
796796
const options = {
797797
lineNumber,
798798
columnNumber,
@@ -802,7 +802,7 @@ export class TimelineUIUtils {
802802
tabStop: true,
803803
omitOrigin,
804804
};
805-
if (isFreshRecording) {
805+
if (isFreshOrEnhanced) {
806806
return linkifier.linkifyScriptLocation(
807807
target, scriptId, url as Platform.DevToolsPath.UrlString, lineNumber, options);
808808
}
@@ -811,7 +811,7 @@ export class TimelineUIUtils {
811811

812812
static linkifyTopCallFrame(
813813
event: Trace.Types.Events.Event, target: SDK.Target.Target|null, linkifier: LegacyComponents.Linkifier.Linkifier,
814-
isFreshRecording = false): Element|null {
814+
isFreshOrEnhanced = false): Element|null {
815815
let frame = Trace.Helpers.Trace.getZeroIndexedStackTraceInEventPayload(event)?.[0];
816816
if (Trace.Types.Events.isProfileCall(event)) {
817817
frame = event.callFrame;
@@ -827,7 +827,7 @@ export class TimelineUIUtils {
827827
columnNumber: frame.columnNumber,
828828
lineNumber: frame.lineNumber,
829829
};
830-
if (isFreshRecording) {
830+
if (isFreshOrEnhanced) {
831831
return linkifier.maybeLinkifyConsoleCallFrame(target, frame, {showColumnNumber: true, inlineFrameIndex: 0});
832832
}
833833
return LegacyComponents.Linkifier.Linkifier.linkifyURL(frame.url as Platform.DevToolsPath.UrlString, options);
@@ -1078,8 +1078,8 @@ export class TimelineUIUtils {
10781078
}
10791079
}
10801080

1081-
const isFreshRecording =
1082-
Boolean(parsedTrace && Tracing.FreshRecording.Tracker.instance().recordingIsFresh(parsedTrace));
1081+
const isFreshOrEnhanced =
1082+
Boolean(parsedTrace && Tracing.FreshRecording.Tracker.instance().recordingIsFreshOrEnhanced(parsedTrace));
10831083

10841084
switch (event.name) {
10851085
case Trace.Types.Events.Name.GC:
@@ -1110,7 +1110,7 @@ export class TimelineUIUtils {
11101110
}
11111111
case Trace.Types.Events.Name.FUNCTION_CALL: {
11121112
const detailsNode = await TimelineUIUtils.buildDetailsNodeForTraceEvent(
1113-
event, targetForEvent(parsedTrace, event), linkifier, isFreshRecording, parsedTrace);
1113+
event, targetForEvent(parsedTrace, event), linkifier, isFreshOrEnhanced, parsedTrace);
11141114
if (detailsNode) {
11151115
contentHelper.appendElementRow(i18nString(UIStrings.function), detailsNode);
11161116
const originWithEntity = this.getOriginWithEntity(entityMapper, parsedTrace, event);
@@ -1473,7 +1473,7 @@ export class TimelineUIUtils {
14731473

14741474
case Trace.Types.Events.Name.EVENT_TIMING: {
14751475
const detailsNode = await TimelineUIUtils.buildDetailsNodeForTraceEvent(
1476-
event, targetForEvent(parsedTrace, event), linkifier, isFreshRecording, parsedTrace);
1476+
event, targetForEvent(parsedTrace, event), linkifier, isFreshOrEnhanced, parsedTrace);
14771477
if (detailsNode) {
14781478
contentHelper.appendElementRow(i18nString(UIStrings.details), detailsNode);
14791479
}
@@ -1491,7 +1491,7 @@ export class TimelineUIUtils {
14911491

14921492
default: {
14931493
const detailsNode = await TimelineUIUtils.buildDetailsNodeForTraceEvent(
1494-
event, targetForEvent(parsedTrace, event), linkifier, isFreshRecording, parsedTrace);
1494+
event, targetForEvent(parsedTrace, event), linkifier, isFreshOrEnhanced, parsedTrace);
14951495
if (detailsNode) {
14961496
contentHelper.appendElementRow(i18nString(UIStrings.details), detailsNode);
14971497
}

front_end/services/tracing/FreshRecording.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,8 @@ export class Tracker {
2828
recordingIsFresh(data: Trace.TraceModel.ParsedTrace): boolean {
2929
return this.#freshRecordings.has(data);
3030
}
31+
32+
recordingIsFreshOrEnhanced(data: Trace.TraceModel.ParsedTrace): boolean {
33+
return this.#freshRecordings.has(data) || data.metadata.enhancedTraceVersion !== undefined;
34+
}
3135
}

0 commit comments

Comments
 (0)