Skip to content

Commit 0a50c35

Browse files
authored
Track Stack Trace Frames Succeed / Fail to Resolve URL (#191)
1 parent fc0a2e7 commit 0a50c35

3 files changed

Lines changed: 54 additions & 7 deletions

File tree

front_end/core/host/RNPerfMetrics.ts

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ class RNPerfMetrics {
3030
// map of panel location to panel name
3131
#currentPanels = new Map<PanelLocation, string>();
3232

33+
isEnabled(): boolean {
34+
return globalThis.enableReactNativePerfMetrics === true;
35+
}
36+
3337
addEventListener(listener: RNReliabilityEventListener): UnsubscribeFn {
3438
this.#listeners.add(listener);
3539

@@ -259,6 +263,15 @@ class RNPerfMetrics {
259263
});
260264
}
261265

266+
stackTraceSymbolicationSucceeded(specialHermesFrameTypes: string[]): void {
267+
this.sendEvent({
268+
eventName: 'StackTraceSymbolicationSucceeded',
269+
params: {
270+
specialHermesFrameTypes,
271+
},
272+
});
273+
}
274+
262275
stackTraceSymbolicationFailed(stackTrace: string, line: string, reason: string): void {
263276
this.sendEvent({
264277
eventName: 'StackTraceSymbolicationFailed',
@@ -270,11 +283,17 @@ class RNPerfMetrics {
270283
});
271284
}
272285

273-
stackTraceSymbolicationSucceeded(specialHermesFrameTypes: string[]): void {
286+
stackTraceFrameUrlResolutionSucceeded(): void {
274287
this.sendEvent({
275-
eventName: 'StackTraceSymbolicationSucceeded',
288+
eventName: 'StackTraceFrameUrlResolutionSucceeded',
289+
});
290+
}
291+
292+
stackTraceFrameUrlResolutionFailed(uniqueUrls: string[]): void {
293+
this.sendEvent({
294+
eventName: 'StackTraceFrameUrlResolutionFailed',
276295
params: {
277-
specialHermesFrameTypes,
296+
uniqueUrls,
278297
},
279298
});
280299
}
@@ -443,6 +462,13 @@ export type PanelClosedEvent = Readonly<{
443462
}>,
444463
}>;
445464

465+
export type StackTraceSymbolicationSucceeded = Readonly<{
466+
eventName: 'StackTraceSymbolicationSucceeded',
467+
params: Readonly<{
468+
specialHermesFrameTypes: string[],
469+
}>,
470+
}>;
471+
446472
export type StackTraceSymbolicationFailed = Readonly<{
447473
eventName: 'StackTraceSymbolicationFailed',
448474
params: Readonly<{
@@ -452,10 +478,14 @@ export type StackTraceSymbolicationFailed = Readonly<{
452478
}>,
453479
}>;
454480

455-
export type StackTraceSymbolicationSucceeded = Readonly<{
456-
eventName: 'StackTraceSymbolicationSucceeded',
481+
export type StackTraceFrameUrlResolutionSucceeded = Readonly<{
482+
eventName: 'StackTraceFrameUrlResolutionSucceeded',
483+
}>;
484+
485+
export type StackTraceFrameUrlResolutionFailed = Readonly<{
486+
eventName: 'StackTraceFrameUrlResolutionFailed',
457487
params: Readonly<{
458-
specialHermesFrameTypes: string[],
488+
uniqueUrls: string[],
459489
}>,
460490
}>;
461491

@@ -464,6 +494,7 @@ export type ReactNativeChromeDevToolsEvent =
464494
BrowserErrorEvent|RemoteDebuggingTerminatedEvent|DeveloperResourceLoadingStartedEvent|
465495
DeveloperResourceLoadingFinishedEvent|FuseboxSetClientMetadataStartedEvent|FuseboxSetClientMetadataFinishedEvent|
466496
MemoryPanelActionStartedEvent|MemoryPanelActionFinishedEvent|PanelShownEvent|PanelClosedEvent|
467-
StackTraceSymbolicationFailed|StackTraceSymbolicationSucceeded;
497+
StackTraceSymbolicationSucceeded|StackTraceSymbolicationFailed|StackTraceFrameUrlResolutionSucceeded|
498+
StackTraceFrameUrlResolutionFailed;
468499

469500
export type DecoratedReactNativeChromeDevToolsEvent = CommonEventFields&ReactNativeChromeDevToolsEvent;

front_end/panels/console/ConsoleViewMessage.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,6 +1844,21 @@ export class ConsoleViewMessage implements ConsoleViewportElement {
18441844
});
18451845
}
18461846

1847+
if (Host.rnPerfMetrics.isEnabled()) {
1848+
const unresolvedScriptUrls = formattedResult
1849+
.querySelectorAll("[data-fallback-anchor='1']")
1850+
.values()
1851+
.map(element => element.getAttribute('title') || '')
1852+
.map(title => title.replace(/\:\d+(?:\:\d+)?$/, '')) // row and column e.g :11:11
1853+
.toArray();
1854+
if (unresolvedScriptUrls.length === 0) {
1855+
Host.rnPerfMetrics.stackTraceFrameUrlResolutionSucceeded();
1856+
} else {
1857+
const uniqueUrls = Array.from(new Set(unresolvedScriptUrls));
1858+
Host.rnPerfMetrics.stackTraceFrameUrlResolutionFailed(uniqueUrls);
1859+
}
1860+
}
1861+
18471862
return formattedResult;
18481863
}
18491864

front_end/ui/legacy/components/utils/Linkifier.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export class Linkifier extends Common.ObjectWrapper.ObjectWrapper<EventTypes> im
264264
const {columnNumber, className = ''} = linkifyURLOptions;
265265
if (sourceURL) {
266266
fallbackAnchor = Linkifier.linkifyURL(sourceURL, linkifyURLOptions);
267+
fallbackAnchor.dataset.fallbackAnchor = '1';
267268
}
268269
if (!target || target.isDisposed()) {
269270
return fallbackAnchor;

0 commit comments

Comments
 (0)