From c3755731b3c1b0cf652e52a5f3fc5515eb4cb917 Mon Sep 17 00:00:00 2001 From: Vitali Zaidman Date: Wed, 2 Jul 2025 14:02:26 +0100 Subject: [PATCH 1/3] parse empty and "address at" urls as non-hyperlinked text --- buildtools | 2 +- third_party/depot_tools | 2 +- third_party/inspector_protocol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildtools b/buildtools index 6f359296daa8..f30f8f10c9d1 160000 --- a/buildtools +++ b/buildtools @@ -1 +1 @@ -Subproject commit 6f359296daa889aa726f3d05046b9f37be241169 +Subproject commit f30f8f10c9d1ad97480dc08eb72f7d9d1bf4cf89 diff --git a/third_party/depot_tools b/third_party/depot_tools index f40ddcd8d516..abc510988246 160000 --- a/third_party/depot_tools +++ b/third_party/depot_tools @@ -1 +1 @@ -Subproject commit f40ddcd8d51626fb7be3ab3c418b3f3be801623f +Subproject commit abc51098824678cbce29d7913c4951a857033c49 diff --git a/third_party/inspector_protocol b/third_party/inspector_protocol index 940abfc668be..6d1ae0f13aae 160000 --- a/third_party/inspector_protocol +++ b/third_party/inspector_protocol @@ -1 +1 @@ -Subproject commit 940abfc668be2591483f7132145593c6a047f3cf +Subproject commit 6d1ae0f13aae6ad381ca31b17b88a0f5af29ca94 From 617ee318766b59ba5be2a68d676cada7c814d851 Mon Sep 17 00:00:00 2001 From: Vitali Zaidman Date: Tue, 1 Jul 2025 14:18:33 +0100 Subject: [PATCH 2/3] track when a special stack trace symbolication occurs --- buildtools | 2 +- third_party/depot_tools | 2 +- third_party/inspector_protocol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildtools b/buildtools index f30f8f10c9d1..6f359296daa8 160000 --- a/buildtools +++ b/buildtools @@ -1 +1 @@ -Subproject commit f30f8f10c9d1ad97480dc08eb72f7d9d1bf4cf89 +Subproject commit 6f359296daa889aa726f3d05046b9f37be241169 diff --git a/third_party/depot_tools b/third_party/depot_tools index abc510988246..f40ddcd8d516 160000 --- a/third_party/depot_tools +++ b/third_party/depot_tools @@ -1 +1 @@ -Subproject commit abc51098824678cbce29d7913c4951a857033c49 +Subproject commit f40ddcd8d51626fb7be3ab3c418b3f3be801623f diff --git a/third_party/inspector_protocol b/third_party/inspector_protocol index 6d1ae0f13aae..940abfc668be 160000 --- a/third_party/inspector_protocol +++ b/third_party/inspector_protocol @@ -1 +1 @@ -Subproject commit 6d1ae0f13aae6ad381ca31b17b88a0f5af29ca94 +Subproject commit 940abfc668be2591483f7132145593c6a047f3cf From 632fb1d3ba3393f2608e44ef7064b1233057afc5 Mon Sep 17 00:00:00 2001 From: Vitali Zaidman Date: Tue, 8 Jul 2025 18:26:46 +0100 Subject: [PATCH 3/3] track stack trace frames succeed or fail to resolve url --- front_end/core/host/RNPerfMetrics.ts | 45 ++++++++++++++++--- .../panels/console/ConsoleViewMessage.ts | 15 +++++++ .../ui/legacy/components/utils/Linkifier.ts | 1 + 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/front_end/core/host/RNPerfMetrics.ts b/front_end/core/host/RNPerfMetrics.ts index 3696e2276f74..1955fd039c41 100644 --- a/front_end/core/host/RNPerfMetrics.ts +++ b/front_end/core/host/RNPerfMetrics.ts @@ -30,6 +30,10 @@ class RNPerfMetrics { // map of panel location to panel name #currentPanels = new Map(); + isEnabled(): boolean { + return globalThis.enableReactNativePerfMetrics === true; + } + addEventListener(listener: RNReliabilityEventListener): UnsubscribeFn { this.#listeners.add(listener); @@ -259,6 +263,15 @@ class RNPerfMetrics { }); } + stackTraceSymbolicationSucceeded(specialHermesFrameTypes: string[]): void { + this.sendEvent({ + eventName: 'StackTraceSymbolicationSucceeded', + params: { + specialHermesFrameTypes, + }, + }); + } + stackTraceSymbolicationFailed(stackTrace: string, line: string, reason: string): void { this.sendEvent({ eventName: 'StackTraceSymbolicationFailed', @@ -270,11 +283,17 @@ class RNPerfMetrics { }); } - stackTraceSymbolicationSucceeded(specialHermesFrameTypes: string[]): void { + stackTraceFrameUrlResolutionSucceeded(): void { this.sendEvent({ - eventName: 'StackTraceSymbolicationSucceeded', + eventName: 'StackTraceFrameUrlResolutionSucceeded', + }); + } + + stackTraceFrameUrlResolutionFailed(uniqueUrls: string[]): void { + this.sendEvent({ + eventName: 'StackTraceFrameUrlResolutionFailed', params: { - specialHermesFrameTypes, + uniqueUrls, }, }); } @@ -443,6 +462,13 @@ export type PanelClosedEvent = Readonly<{ }>, }>; +export type StackTraceSymbolicationSucceeded = Readonly<{ + eventName: 'StackTraceSymbolicationSucceeded', + params: Readonly<{ + specialHermesFrameTypes: string[], + }>, +}>; + export type StackTraceSymbolicationFailed = Readonly<{ eventName: 'StackTraceSymbolicationFailed', params: Readonly<{ @@ -452,10 +478,14 @@ export type StackTraceSymbolicationFailed = Readonly<{ }>, }>; -export type StackTraceSymbolicationSucceeded = Readonly<{ - eventName: 'StackTraceSymbolicationSucceeded', +export type StackTraceFrameUrlResolutionSucceeded = Readonly<{ + eventName: 'StackTraceFrameUrlResolutionSucceeded', +}>; + +export type StackTraceFrameUrlResolutionFailed = Readonly<{ + eventName: 'StackTraceFrameUrlResolutionFailed', params: Readonly<{ - specialHermesFrameTypes: string[], + uniqueUrls: string[], }>, }>; @@ -464,6 +494,7 @@ export type ReactNativeChromeDevToolsEvent = BrowserErrorEvent|RemoteDebuggingTerminatedEvent|DeveloperResourceLoadingStartedEvent| DeveloperResourceLoadingFinishedEvent|FuseboxSetClientMetadataStartedEvent|FuseboxSetClientMetadataFinishedEvent| MemoryPanelActionStartedEvent|MemoryPanelActionFinishedEvent|PanelShownEvent|PanelClosedEvent| - StackTraceSymbolicationFailed|StackTraceSymbolicationSucceeded; + StackTraceSymbolicationSucceeded|StackTraceSymbolicationFailed|StackTraceFrameUrlResolutionSucceeded| + StackTraceFrameUrlResolutionFailed; export type DecoratedReactNativeChromeDevToolsEvent = CommonEventFields&ReactNativeChromeDevToolsEvent; diff --git a/front_end/panels/console/ConsoleViewMessage.ts b/front_end/panels/console/ConsoleViewMessage.ts index 837462d66208..30081ad4048f 100644 --- a/front_end/panels/console/ConsoleViewMessage.ts +++ b/front_end/panels/console/ConsoleViewMessage.ts @@ -1844,6 +1844,21 @@ export class ConsoleViewMessage implements ConsoleViewportElement { }); } + if (Host.rnPerfMetrics.isEnabled()) { + const unresolvedScriptUrls = formattedResult + .querySelectorAll("[data-fallback-anchor='1']") + .values() + .map(element => element.getAttribute('title') || '') + .map(title => title.replace(/\:\d+(?:\:\d+)?$/, '')) // row and column e.g :11:11 + .toArray(); + if (unresolvedScriptUrls.length === 0) { + Host.rnPerfMetrics.stackTraceFrameUrlResolutionSucceeded(); + } else { + const uniqueUrls = Array.from(new Set(unresolvedScriptUrls)); + Host.rnPerfMetrics.stackTraceFrameUrlResolutionFailed(uniqueUrls); + } + } + return formattedResult; } diff --git a/front_end/ui/legacy/components/utils/Linkifier.ts b/front_end/ui/legacy/components/utils/Linkifier.ts index 38bf868c0474..53a2567e4805 100644 --- a/front_end/ui/legacy/components/utils/Linkifier.ts +++ b/front_end/ui/legacy/components/utils/Linkifier.ts @@ -264,6 +264,7 @@ export class Linkifier extends Common.ObjectWrapper.ObjectWrapper im const {columnNumber, className = ''} = linkifyURLOptions; if (sourceURL) { fallbackAnchor = Linkifier.linkifyURL(sourceURL, linkifyURLOptions); + fallbackAnchor.dataset.fallbackAnchor = '1'; } if (!target || target.isDisposed()) { return fallbackAnchor;