diff --git a/packages/dev-middleware/src/inspector-proxy/types.js b/packages/dev-middleware/src/inspector-proxy/types.js index a89bfc9a914d..ed37c285fc5a 100644 --- a/packages/dev-middleware/src/inspector-proxy/types.js +++ b/packages/dev-middleware/src/inspector-proxy/types.js @@ -37,6 +37,13 @@ export type TargetCapabilityFlags = $ReadOnly<{ * In the proxy, this disables intercepting and storing network requests. */ nativeNetworkInspection?: boolean, + + /** + * The target supports the modern `rn_fusebox.html` entry point. + * + * In the launch flow, this controls the Chrome DevTools entrypoint that is used. + */ + prefersFuseboxFrontend?: boolean, }>; // Page information received from the device. New page is created for diff --git a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js index 6b571f7aa026..2f1cf95b5d15 100644 --- a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js +++ b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js @@ -107,6 +107,9 @@ export default function openDebuggerMiddleware({ return; } + const useFuseboxEntryPoint = + target.reactNative.capabilities?.prefersFuseboxFrontend; + try { switch (launchType) { case 'launch': @@ -122,6 +125,7 @@ export default function openDebuggerMiddleware({ experiments, target.webSocketDebuggerUrl, serverBaseUrl, + {useFuseboxEntryPoint}, ), ), ); @@ -133,7 +137,7 @@ export default function openDebuggerMiddleware({ experiments, target.webSocketDebuggerUrl, serverBaseUrl, - {relative: true}, + {relative: true, useFuseboxEntryPoint}, ), }); res.end(); diff --git a/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js b/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js index 7dd33dfd9d08..a3cabc78afc0 100644 --- a/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js +++ b/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js @@ -20,6 +20,7 @@ export default function getDevToolsFrontendUrl( devServerUrl: string, options?: $ReadOnly<{ relative?: boolean, + useFuseboxEntryPoint?: boolean, }>, ): string { const wsParam = getWsParam({ @@ -29,7 +30,10 @@ export default function getDevToolsFrontendUrl( const appUrl = (options?.relative === true ? '' : devServerUrl) + - '/debugger-frontend/rn_inspector.html'; + '/debugger-frontend/' + + (options?.useFuseboxEntryPoint === true + ? 'rn_fusebox.html' + : 'rn_inspector.html'); const searchParams = new URLSearchParams([ [wsParam.key, wsParam.value], diff --git a/packages/react-native/React/Base/RCTBridge.mm b/packages/react-native/React/Base/RCTBridge.mm index 0a5e8a6dc899..5ffcb25d8879 100644 --- a/packages/react-native/React/Base/RCTBridge.mm +++ b/packages/react-native/React/Base/RCTBridge.mm @@ -436,7 +436,7 @@ - (void)setUp .integrationName = "iOS Bridge (RCTBridge)", }); }, - {.nativePageReloads = true}); + {.nativePageReloads = true, .prefersFuseboxFrontend = true}); } Class bridgeClass = self.bridgeClass; diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp index 52e1b8795933..aba0a4335ada 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp @@ -50,7 +50,7 @@ ReactInstanceManagerInspectorTarget::ReactInstanceManagerInspectorTarget( "Android Bridge (ReactInstanceManagerInspectorTarget)", }); }, - {.nativePageReloads = true}); + {.nativePageReloads = true, .prefersFuseboxFrontend = true}); } } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp index eb47f4af4a32..89fd8ce02bb9 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp @@ -45,7 +45,7 @@ JReactHostInspectorTarget::JReactHostInspectorTarget( // Reject the connection. return nullptr; }, - {.nativePageReloads = true}); + {.nativePageReloads = true, .prefersFuseboxFrontend = true}); } } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp index b8ac15d7b919..295805593899 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp @@ -28,7 +28,8 @@ const folly::dynamic targetCapabilitiesToDynamic( const InspectorTargetCapabilities& capabilities) { return folly::dynamic::object( "nativePageReloads", capabilities.nativePageReloads)( - "nativeSourceCodeFetching", capabilities.nativeSourceCodeFetching); + "nativeSourceCodeFetching", capabilities.nativeSourceCodeFetching)( + "prefersFuseboxFrontend", capabilities.prefersFuseboxFrontend); } namespace { diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h index 07591f194d57..5790c059b45d 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h @@ -36,6 +36,7 @@ class IDestructible { struct InspectorTargetCapabilities { const bool nativePageReloads = false; const bool nativeSourceCodeFetching = false; + const bool prefersFuseboxFrontend = false; }; const folly::dynamic targetCapabilitiesToDynamic( diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm index 4547a0daee19..975906420bf1 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm @@ -191,7 +191,7 @@ - (void)start .integrationName = "iOS Bridgeless (RCTHost)", }); }, - {.nativePageReloads = true}); + {.nativePageReloads = true, .prefersFuseboxFrontend = true}); } if (_instance) { RCTLogWarn(