diff --git a/front_end/core/host/RNPerfMetrics.ts b/front_end/core/host/RNPerfMetrics.ts index 07b50d7aa7a3..3696e2276f74 100644 --- a/front_end/core/host/RNPerfMetrics.ts +++ b/front_end/core/host/RNPerfMetrics.ts @@ -270,6 +270,15 @@ class RNPerfMetrics { }); } + stackTraceSymbolicationSucceeded(specialHermesFrameTypes: string[]): void { + this.sendEvent({ + eventName: 'StackTraceSymbolicationSucceeded', + params: { + specialHermesFrameTypes, + }, + }); + } + panelShown(_panelName: string, _isLaunching?: boolean): void { // no-op // We only care about the "main" and "drawer" panels for now via panelShownInLocation(…) @@ -443,10 +452,18 @@ export type StackTraceSymbolicationFailed = Readonly<{ }>, }>; +export type StackTraceSymbolicationSucceeded = Readonly<{ + eventName: 'StackTraceSymbolicationSucceeded', + params: Readonly<{ + specialHermesFrameTypes: string[], + }>, +}>; + export type ReactNativeChromeDevToolsEvent = EntrypointLoadingStartedEvent|EntrypointLoadingFinishedEvent|DebuggerReadyEvent|BrowserVisibilityChangeEvent| BrowserErrorEvent|RemoteDebuggingTerminatedEvent|DeveloperResourceLoadingStartedEvent| DeveloperResourceLoadingFinishedEvent|FuseboxSetClientMetadataStartedEvent|FuseboxSetClientMetadataFinishedEvent| - MemoryPanelActionStartedEvent|MemoryPanelActionFinishedEvent|PanelShownEvent|PanelClosedEvent|StackTraceSymbolicationFailed; + MemoryPanelActionStartedEvent|MemoryPanelActionFinishedEvent|PanelShownEvent|PanelClosedEvent| + StackTraceSymbolicationFailed|StackTraceSymbolicationSucceeded; export type DecoratedReactNativeChromeDevToolsEvent = CommonEventFields&ReactNativeChromeDevToolsEvent; diff --git a/front_end/panels/console/ErrorStackParser.ts b/front_end/panels/console/ErrorStackParser.ts index fa76b3aac2fd..76099805238c 100644 --- a/front_end/panels/console/ErrorStackParser.ts +++ b/front_end/panels/console/ErrorStackParser.ts @@ -71,6 +71,8 @@ export function parseSourcePositionsFromErrorStack( const lines = stack.split('\n'); const linkInfos = []; + const specialHermesFramesParsed = new Set(); + for (const line of lines) { const match = /^\s*at\s(async\s)?/.exec(line); if (!match) { @@ -118,6 +120,9 @@ export function parseSourcePositionsFromErrorStack( } else { linkInfos.push({line, isCallFrame}); } + if (specialHermesFrameType !== null) { + specialHermesFramesParsed.add(specialHermesFrameType); + } continue; } let url = parseOrScriptMatch(debuggerModel, splitResult.url); @@ -142,6 +147,11 @@ export function parseSourcePositionsFromErrorStack( }, }); } + + if (linkInfos?.length) { + Host.rnPerfMetrics.stackTraceSymbolicationSucceeded(Array.from(specialHermesFramesParsed)); + } + return linkInfos; }