Skip to content

Commit

Permalink
[Fiber] Make DevTools Config use Static Injection (#30522)
Browse files Browse the repository at this point in the history
We use static dependency injection. We shouldn't use this dynamic
dependency injection we do for DevTools internals. There's also meta
programming like spreading and stuff that isn't needed.

This moves the config from `injectIntoDevTools` to the FiberConfig so it
can be statically resolved.

Closure Compiler has some trouble generating optimal code for this
anyway so ideally we'd refactor this further but at least this is better
and saves a few bytes and avoids some code paths (when minified).
  • Loading branch information
sebmarkbage authored Jul 30, 2024
1 parent f963c80 commit 146df7c
Show file tree
Hide file tree
Showing 16 changed files with 141 additions and 171 deletions.
9 changes: 3 additions & 6 deletions packages/react-art/src/ReactART.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,7 @@ class Text extends React.Component {
}
}

injectIntoDevTools({
findFiberByHostInstance: () => null,
bundleType: __DEV__ ? 1 : 0,
version: ReactVersion,
rendererPackageName: 'react-art',
});
injectIntoDevTools();

/** API */

Expand All @@ -169,3 +164,5 @@ export const Group = TYPES.GROUP;
export const Shape = TYPES.SHAPE;
export const Path = Mode.Path;
export {LinearGradient, Pattern, RadialGradient, Surface, Text, Transform};

export {ReactVersion as version};
8 changes: 6 additions & 2 deletions packages/react-art/src/ReactFiberConfigART.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ import {
NoEventPriority,
} from 'react-reconciler/src/ReactEventPriorities';

export {default as rendererVersion} from 'shared/ReactVersion';
export const rendererPackageName = 'react-art';
export const extraDevToolsConfig = null;

const pooledTransform = new Transform();

const NO_CONTEXT = {};
Expand Down Expand Up @@ -441,8 +445,8 @@ export function clearContainer(container) {
// TODO Implement this
}

export function getInstanceFromNode(node) {
throw new Error('Not implemented.');
export function getInstanceFromNode(node): null {
return null;
}

export function beforeActiveInstanceBlur(internalInstanceHandle: Object) {
Expand Down
11 changes: 7 additions & 4 deletions packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ import type {
PreinitModuleScriptOptions,
} from 'react-dom/src/shared/ReactDOMTypes';

import {NotPending} from 'react-dom-bindings/src/shared/ReactDOMFormActions';
import {NotPending} from '../shared/ReactDOMFormActions';

import {getCurrentRootHostContainer} from 'react-reconciler/src/ReactFiberHostContext';

import hasOwnProperty from 'shared/hasOwnProperty';
Expand Down Expand Up @@ -106,6 +107,10 @@ import {requestFormReset as requestFormResetOnFiber} from 'react-reconciler/src/

import ReactDOMSharedInternals from 'shared/ReactDOMSharedInternals';

export {default as rendererVersion} from 'shared/ReactVersion';
export const rendererPackageName = 'react-dom';
export const extraDevToolsConfig = null;

export type Type = string;
export type Props = {
autoFocus?: boolean,
Expand Down Expand Up @@ -616,9 +621,7 @@ const localRequestAnimationFrame =
? requestAnimationFrame
: scheduleTimeout;

export function getInstanceFromNode(node: HTMLElement): null | Object {
return getClosestInstanceFromNode(node) || null;
}
export {getClosestInstanceFromNode as getInstanceFromNode};

export function preparePortalMount(portalInstance: Instance): void {
listenToAllSupportedEvents(portalInstance);
Expand Down
8 changes: 1 addition & 7 deletions packages/react-dom/src/client/ReactDOMClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {
import {canUseDOM} from 'shared/ExecutionEnvironment';
import ReactVersion from 'shared/ReactVersion';

import {getClosestInstanceFromNode} from 'react-dom-bindings/src/client/ReactDOMComponentTree';
import Internals from 'shared/ReactDOMSharedInternals';

import {ensureCorrectIsomorphicReactVersion} from '../shared/ensureCorrectIsomorphicReactVersion';
Expand Down Expand Up @@ -52,12 +51,7 @@ Internals.findDOMNode = findDOMNode;

export {ReactVersion as version, createRoot, hydrateRoot};

const foundDevTools = injectIntoDevTools({
findFiberByHostInstance: getClosestInstanceFromNode,
bundleType: __DEV__ ? 1 : 0,
version: ReactVersion,
rendererPackageName: 'react-dom',
});
const foundDevTools = injectIntoDevTools();

if (__DEV__) {
if (!foundDevTools && canUseDOM && window.top === window.self) {
Expand Down
8 changes: 1 addition & 7 deletions packages/react-dom/src/client/ReactDOMClientFB.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import {ensureCorrectIsomorphicReactVersion} from '../shared/ensureCorrectIsomor
ensureCorrectIsomorphicReactVersion();

import {
getClosestInstanceFromNode,
getInstanceFromNode,
getNodeFromInstance,
getFiberCurrentPropsFromNode,
Expand Down Expand Up @@ -147,12 +146,7 @@ Internals.Events /* Events */ = [
unstable_batchedUpdates,
];

const foundDevTools = injectIntoDevTools({
findFiberByHostInstance: getClosestInstanceFromNode,
bundleType: __DEV__ ? 1 : 0,
version: ReactVersion,
rendererPackageName: 'react-dom',
});
const foundDevTools = injectIntoDevTools();

if (__DEV__) {
if (!foundDevTools && canUseDOM && window.top === window.self) {
Expand Down
24 changes: 2 additions & 22 deletions packages/react-native-renderer/src/ReactFabric.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,8 @@ import {

import {createPortal as createPortalImpl} from 'react-reconciler/src/ReactPortal';
import {setBatchingImplementation} from './legacy-events/ReactGenericBatching';
import ReactVersion from 'shared/ReactVersion';

import {getClosestInstanceFromNode} from './ReactFabricComponentTree';
import {
getInspectorDataForViewTag,
getInspectorDataForViewAtPoint,
getInspectorDataForInstance,
} from './ReactNativeFiberInspector';
import {getInspectorDataForInstance} from './ReactNativeFiberInspector';
import {LegacyRoot, ConcurrentRoot} from 'react-reconciler/src/ReactRootTags';
import {
findHostInstance_DEPRECATED,
Expand Down Expand Up @@ -209,18 +203,4 @@ export {
isChildPublicInstance,
};

injectIntoDevTools({
// $FlowExpectedError[incompatible-call] The type of `Instance` in `getClosestInstanceFromNode` does not match in Fabric and the legacy renderer, so it fails to typecheck here.
findFiberByHostInstance: getClosestInstanceFromNode,
bundleType: __DEV__ ? 1 : 0,
version: ReactVersion,
rendererPackageName: 'react-native-renderer',
rendererConfig: {
getInspectorDataForInstance,
getInspectorDataForViewTag: getInspectorDataForViewTag,
getInspectorDataForViewAtPoint: getInspectorDataForViewAtPoint.bind(
null,
findNodeHandle,
),
},
});
injectIntoDevTools();
20 changes: 17 additions & 3 deletions packages/react-native-renderer/src/ReactFiberConfigFabric.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,27 @@ const {
unstable_getCurrentEventPriority: fabricGetCurrentEventPriority,
} = nativeFabricUIManager;

import {getClosestInstanceFromNode} from './ReactFabricComponentTree';

import {
getInspectorDataForViewTag,
getInspectorDataForViewAtPoint,
getInspectorDataForInstance,
} from './ReactNativeFiberInspector';

import {
enableFabricCompleteRootInCommitPhase,
passChildrenWhenCloningPersistedNodes,
} from 'shared/ReactFeatureFlags';

export {default as rendererVersion} from 'shared/ReactVersion'; // TODO: Consider exporting the react-native version.
export const rendererPackageName = 'react-native-renderer';
export const extraDevToolsConfig = {
getInspectorDataForInstance,
getInspectorDataForViewTag,
getInspectorDataForViewAtPoint,
};

const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;

// Counter for uniquely identifying views.
Expand Down Expand Up @@ -487,9 +503,7 @@ export function replaceContainerChildren(
}
}

export function getInstanceFromNode(node: any): empty {
throw new Error('Not yet implemented.');
}
export {getClosestInstanceFromNode as getInstanceFromNode};

export function beforeActiveInstanceBlur(
internalInstanceHandle: InternalInstanceHandle,
Expand Down
19 changes: 16 additions & 3 deletions packages/react-native-renderer/src/ReactFiberConfigNative.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
precacheFiberNode,
uncacheFiberNode,
updateFiberProps,
getClosestInstanceFromNode,
} from './ReactNativeComponentTree';
import ReactNativeFiberHostComponent from './ReactNativeFiberHostComponent';

Expand All @@ -31,6 +32,20 @@ import {
} from 'react-reconciler/src/ReactEventPriorities';
import type {Fiber} from 'react-reconciler/src/ReactInternalTypes';

import {
getInspectorDataForViewTag,
getInspectorDataForViewAtPoint,
getInspectorDataForInstance,
} from './ReactNativeFiberInspector';

export {default as rendererVersion} from 'shared/ReactVersion'; // TODO: Consider exporting the react-native version.
export const rendererPackageName = 'react-native-renderer';
export const extraDevToolsConfig = {
getInspectorDataForInstance,
getInspectorDataForViewTag,
getInspectorDataForViewAtPoint,
};

const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;

export type Type = string;
Expand Down Expand Up @@ -506,9 +521,7 @@ export function unhideTextInstance(
throw new Error('Not yet implemented.');
}

export function getInstanceFromNode(node: any): empty {
throw new Error('Not yet implemented.');
}
export {getClosestInstanceFromNode as getInstanceFromNode};

export function beforeActiveInstanceBlur(internalInstanceHandle: Object) {
// noop
Expand Down
16 changes: 7 additions & 9 deletions packages/react-native-renderer/src/ReactNativeFiberInspector.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ import {
} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';
import {enableGetInspectorDataForInstanceInProduction} from 'shared/ReactFeatureFlags';
import {getClosestInstanceFromNode} from './ReactNativeComponentTree';
import {getNodeFromInternalInstanceHandle} from './ReactNativePublicCompat';
import {
getNodeFromInternalInstanceHandle,
findNodeHandle,
} from './ReactNativePublicCompat';
import {getStackByFiberInDevAndProd} from 'react-reconciler/src/ReactFiberComponentStack';

const emptyObject = {};
Expand All @@ -35,7 +38,7 @@ if (__DEV__) {
function createHierarchy(fiberHierarchy) {
return fiberHierarchy.map(fiber => ({
name: getComponentNameFromType(fiber.type),
getInspectorData: findNodeHandle => {
getInspectorData: () => {
return {
props: getHostProps(fiber),
measure: callback => {
Expand All @@ -49,19 +52,15 @@ function createHierarchy(fiberHierarchy) {
if (node) {
nativeFabricUIManager.measure(node, callback);
} else {
return UIManager.measure(
getHostNode(fiber, findNodeHandle),
callback,
);
return UIManager.measure(getHostNode(fiber), callback);
}
},
};
},
}));
}

// $FlowFixMe[missing-local-annot]
function getHostNode(fiber: Fiber | null, findNodeHandle) {
function getHostNode(fiber: Fiber | null) {
if (__DEV__ || enableGetInspectorDataForInstanceInProduction) {
let hostNode;
// look for children first for the hostNode
Expand Down Expand Up @@ -179,7 +178,6 @@ function getInspectorDataForViewTag(viewTag: number): InspectorData {
}

function getInspectorDataForViewAtPoint(
findNodeHandle: (componentOrHandle: any) => ?number,
inspectedView: Object,
locationX: number,
locationY: number,
Expand Down
22 changes: 2 additions & 20 deletions packages/react-native-renderer/src/ReactNativeRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,11 @@ import {
setBatchingImplementation,
batchedUpdates,
} from './legacy-events/ReactGenericBatching';
import ReactVersion from 'shared/ReactVersion';
// Modules provided by RN:
import {UIManager} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';

import {getClosestInstanceFromNode} from './ReactNativeComponentTree';
import {
getInspectorDataForViewTag,
getInspectorDataForViewAtPoint,
getInspectorDataForInstance,
} from './ReactNativeFiberInspector';
import {getInspectorDataForInstance} from './ReactNativeFiberInspector';
import {LegacyRoot} from 'react-reconciler/src/ReactRootTags';
import {
findHostInstance_DEPRECATED,
Expand Down Expand Up @@ -233,17 +228,4 @@ export {
isChildPublicInstance,
};

injectIntoDevTools({
findFiberByHostInstance: getClosestInstanceFromNode,
bundleType: __DEV__ ? 1 : 0,
version: ReactVersion,
rendererPackageName: 'react-native-renderer',
rendererConfig: {
getInspectorDataForInstance,
getInspectorDataForViewTag: getInspectorDataForViewTag,
getInspectorDataForViewAtPoint: getInspectorDataForViewAtPoint.bind(
null,
findNodeHandle,
),
},
});
injectIntoDevTools();
4 changes: 4 additions & 0 deletions packages/react-noop-renderer/src/createReactNoop.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import {
} from 'shared/ReactFeatureFlags';

import ReactSharedInternals from 'shared/ReactSharedInternals';
import ReactVersion from 'shared/ReactVersion';

type Container = {
rootID: string,
Expand Down Expand Up @@ -367,6 +368,9 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
}

const sharedHostConfig = {
rendererVersion: ReactVersion,
rendererPackageName: 'react-noop',

supportsSingletons: false,

getRootHostContext() {
Expand Down
33 changes: 3 additions & 30 deletions packages/react-reconciler/src/ReactFiberDevToolsHook.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import type {EventPriority} from './ReactEventPriorities';
// React which this hook might be in.
type DevToolsProfilingHooks = any;

import {getLabelForLane, TotalLanes} from 'react-reconciler/src/ReactFiberLane';
import {DidCapture} from './ReactFiberFlags';
import {
consoleManagedByDevToolsDuringStrictMode,
Expand Down Expand Up @@ -75,17 +74,6 @@ export function injectInternals(internals: Object): boolean {
return true;
}
try {
if (enableSchedulingProfiler) {
// Conditionally inject these hooks only if Timeline profiler is supported by this build.
// This gives DevTools a way to feature detect that isn't tied to version number
// (since profiling and timeline are controlled by different feature flags).
internals = {
...internals,
getLaneLabelMap,
injectProfilingHooks,
};
}

rendererID = hook.inject(internals);

// We have successfully injected, so now it is safe to set up hooks.
Expand Down Expand Up @@ -235,27 +223,12 @@ export function setIsStrictModeForDevtools(newIsStrictMode: boolean) {

// Profiler API hooks

function injectProfilingHooks(profilingHooks: DevToolsProfilingHooks): void {
export function injectProfilingHooks(
profilingHooks: DevToolsProfilingHooks,
): void {
injectedProfilingHooks = profilingHooks;
}

function getLaneLabelMap(): Map<Lane, string> | null {
if (enableSchedulingProfiler) {
const map: Map<Lane, string> = new Map();

let lane = 1;
for (let index = 0; index < TotalLanes; index++) {
const label = ((getLabelForLane(lane): any): string);
map.set(lane, label);
lane *= 2;
}

return map;
} else {
return null;
}
}

export function markCommitStarted(lanes: Lanes): void {
if (enableSchedulingProfiler) {
if (
Expand Down
Loading

0 comments on commit 146df7c

Please sign in to comment.