From 4cc5b7a90bac7e1f8ac51a9ac570d3ada3bddcb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Tue, 3 Mar 2026 13:12:23 +0000 Subject: [PATCH] Add support for event information in React scheduler tracks in React Native (#35947) ## Summary This defines the same fiber configuration for RN as used in DOM, so we can expose event timing information in the React scheduler tracks in performance traces. This was unblocked by #35913 and #35912. ## How did you test this change? Manually compiled the renderer and tested e2e in FB infra: Screenshot 2026-03-03 at 10 10 44 --- .../src/ReactFiberConfigFabric.js | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/packages/react-native-renderer/src/ReactFiberConfigFabric.js b/packages/react-native-renderer/src/ReactFiberConfigFabric.js index 4eeac5433777..26f921bf4297 100644 --- a/packages/react-native-renderer/src/ReactFiberConfigFabric.js +++ b/packages/react-native-renderer/src/ReactFiberConfigFabric.js @@ -422,14 +422,48 @@ export function resolveUpdatePriority(): EventPriority { return DefaultEventPriority; } -export function trackSchedulerEvent(): void {} +let schedulerEvent: void | Event = undefined; +export function trackSchedulerEvent(): void { + schedulerEvent = global.event; +} + +function getEventType(event: Event): null | string { + if (event.type) { + return event.type; + } + + // Legacy implementation. RN does not define the `type` property on the event object yet. + // $FlowExpectedError[prop-missing] + const dispatchConfig = event.dispatchConfig; + if ( + dispatchConfig == null || + dispatchConfig.phasedRegistrationNames == null + ) { + return null; + } + + const rawEventType = + dispatchConfig.phasedRegistrationNames.bubbled || + dispatchConfig.phasedRegistrationNames.captured; + if (!rawEventType) { + return null; + } + + if (rawEventType.startsWith('on')) { + return rawEventType.slice(2).toLowerCase(); + } + + return rawEventType.toLowerCase(); +} export function resolveEventType(): null | string { - return null; + const event = global.event; + return event && event !== schedulerEvent ? getEventType(event) : null; } export function resolveEventTimeStamp(): number { - return -1.1; + const event = global.event; + return event && event !== schedulerEvent ? event.timeStamp : -1.1; } export function shouldAttemptEagerTransition(): boolean {