Skip to content

Reach public modules through umbrellas from unguarded exported headers - #59026

Open
coado wants to merge 2 commits into
react:mainfrom
coado:export-D124323428
Open

coado wants to merge 2 commits into
react:mainfrom
coado:export-D124323428

Conversation

@coado

@coado coado commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary:
Several exported headers without a stable API guard included fine-grained headers of public modules directly. They are preprocessed in the including translation unit, so under RN_STRICT_API any app or library including them hits the public module's UmbrellaGuard.h #error. Switch them to the module umbrellas:

  • iOS RCTCallInvoker.h, RCTBridgeProxy+Cxx.h: <React/CallInvoker.h>; NSDataBigString.h: <React/JSBigString.h>.
  • Android react/fabric/AnimatedPropBufferEncoder.h: <React/RendererCore.h>; react/runtime/jni/JJSTimerExecutor.h, JReactInstance.h: <React/RuntimeExecutor.h>.
  • ReactCxxPlatform ImageLoaderModule.h, NativeExceptionsManager.h: <React/Bridging.h>; IMountingManager.h, RunLoopObserverManager.h: <React/RendererCore.h>; ReactHost.h: <React/CallInvoker.h>, <React/NativeModuleCore.h>; ReactInstanceConfig.h: <React/Debug.h>.

Each umbrella is a superset of the header it replaces, so no declarations are lost. Includes of "for frameworks" headers stay direct. The guards are inert without RN_STRICT_API.

With use_frameworks!, a <React/...> umbrella lives only in its owning pod's framework headers, which CocoaPods adds to dependents' search paths only for pods in ReactNativePodsUtils.stable_umbrella_frameworks. React-Core now reaches the React-cxxreact and React-callinvoker umbrellas, so add both pods to that list; otherwise the dynamic frameworks build fails with 'React/JSBigString.h' file not found.

Changelog: [Internal]

Reviewed By: christophpurrer

Differential Revision: D124323428

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Oct 13, 2026
@facebook-github-tools facebook-github-tools Bot added p: Software Mansion Partner: Software Mansion Partner labels Oct 13, 2026
@meta-codesync

meta-codesync Bot commented Oct 13, 2026

Copy link
Copy Markdown

@coado has exported this pull request. If you are a Meta employee, you can view the originating Diff in D124323428.

@facebook-github-tools facebook-github-tools Bot added the p: Facebook Partner: Facebook label Oct 13, 2026
@meta-codesync meta-codesync Bot changed the title Reach public modules through umbrellas from unguarded exported headers Reach public modules through umbrellas from unguarded exported headers (#59026) Oct 13, 2026
coado added a commit to coado/react-native that referenced this pull request Oct 13, 2026
react#59026)

Summary:

Several exported headers without a stable API guard included fine-grained headers of public modules directly. They are preprocessed in the including translation unit, so under `RN_STRICT_API` any app or library including them hits the public module's `UmbrellaGuard.h` `#error`. Switch them to the module umbrellas:

- iOS `RCTCallInvoker.h`, `RCTBridgeProxy+Cxx.h`: `<React/CallInvoker.h>`; `NSDataBigString.h`: `<React/JSBigString.h>`.
- Android `react/fabric/AnimatedPropBufferEncoder.h`: `<React/RendererCore.h>`; `react/runtime/jni/JJSTimerExecutor.h`, `JReactInstance.h`: `<React/RuntimeExecutor.h>`.
- ReactCxxPlatform `ImageLoaderModule.h`, `NativeExceptionsManager.h`: `<React/Bridging.h>`; `IMountingManager.h`, `RunLoopObserverManager.h`: `<React/RendererCore.h>`; `ReactHost.h`: `<React/CallInvoker.h>`, `<React/NativeModuleCore.h>`; `ReactInstanceConfig.h`: `<React/Debug.h>`.

Each umbrella is a superset of the header it replaces, so no declarations are lost. Includes of "for frameworks" headers stay direct. The guards are inert without `RN_STRICT_API`.

Changelog: [Internal]

Reviewed By: christophpurrer

Differential Revision: D124323428
@coado
coado force-pushed the export-D124323428 branch from b4ae527 to ddadc6f Compare October 13, 2026 08:39
Summary:
Several "for frameworks" headers included fine-grained headers of public modules directly. A framework author includes a for-frameworks header directly, outside any umbrella, so under `RN_STRICT_API` those includes hit the public module's `UmbrellaGuard.h` `#error`, which `RN_ALLOW_FRAMEWORKS` does not suppress. Switch them to the module umbrellas:

- Image component (`ImageComponentDescriptor.h`, `ImageEventEmitter.h`, `ImageProps.h`, `ImageShadowNode.h`, `ImageState.h`): `<React/View.h>`, `<React/RendererCore.h>`, `<React/Graphics.h>`, `<React/ImageManager.h>`.
- `ComponentDescriptorFactory.h`: `<React/RendererCore.h>`, `<React/Utils.h>`, `<React/ComponentRegistry.h>`.
- `react/renderer/core` `DynamicEventPayload.h`, `DynamicPointerEvent.h`, `DynamicPropsUtilities.h`, `ReactRootViewTagGenerator.h`: `<React/RendererCore.h>`.
- `DefaultTurboModules.h`: `<React/NativeModuleCore.h>`.
- iOS/macOS `RCTInstance.h` and `RCTContextContainerHandling.h`: `<React/CallInvoker.h>`, `<React/Utils.h>`.

`ImageProps.h` now reaches the image manager through `<React/ImageManager.h>`, which also pulls in the platform-specific `ImageRequestParams.h`. `LayoutAnimationKeyFrameManager.cpp` included `ImageProps.h` without using it; that build unit cannot see the platform image manager headers in the Swift Package Manager and CocoaPods `React-Fabric` targets, so the unused include is removed.

Includes of for-frameworks headers in the same module stay direct, since umbrellas do not re-export them. The `react/renderer/core` headers and `ComponentDescriptorFactory.h` now include their own module's umbrella, so the CMake `react_renderer_core` and `react_renderer_componentregistry` targets expose their umbrella directory as `PUBLIC` instead of `INTERFACE`: core's own sources (`EventEmitter.cpp`, `Props.cpp`, `ShadowNode.cpp`, ...) include these headers and must resolve `<React/RendererCore.h>` too. Each umbrella is a superset of the headers it replaces, so no declarations are lost. The guards are inert without `RN_STRICT_API`.

Changelog: [Internal]

Differential Revision: D124320010
coado added a commit to coado/react-native that referenced this pull request Oct 13, 2026
react#59026)

Summary:

Several exported headers without a stable API guard included fine-grained headers of public modules directly. They are preprocessed in the including translation unit, so under `RN_STRICT_API` any app or library including them hits the public module's `UmbrellaGuard.h` `#error`. Switch them to the module umbrellas:

- iOS `RCTCallInvoker.h`, `RCTBridgeProxy+Cxx.h`: `<React/CallInvoker.h>`; `NSDataBigString.h`: `<React/JSBigString.h>`.
- Android `react/fabric/AnimatedPropBufferEncoder.h`: `<React/RendererCore.h>`; `react/runtime/jni/JJSTimerExecutor.h`, `JReactInstance.h`: `<React/RuntimeExecutor.h>`.
- ReactCxxPlatform `ImageLoaderModule.h`, `NativeExceptionsManager.h`: `<React/Bridging.h>`; `IMountingManager.h`, `RunLoopObserverManager.h`: `<React/RendererCore.h>`; `ReactHost.h`: `<React/CallInvoker.h>`, `<React/NativeModuleCore.h>`; `ReactInstanceConfig.h`: `<React/Debug.h>`.

Each umbrella is a superset of the header it replaces, so no declarations are lost. Includes of "for frameworks" headers stay direct. The guards are inert without `RN_STRICT_API`.

Changelog: [Internal]

Reviewed By: christophpurrer

Differential Revision: D124323428
@coado
coado force-pushed the export-D124323428 branch from ddadc6f to f42d2c9 Compare October 13, 2026 08:42
coado added a commit to coado/react-native that referenced this pull request Oct 13, 2026
react#59026)

Summary:
Pull Request resolved: react#59026

Several exported headers without a stable API guard included fine-grained headers of public modules directly. They are preprocessed in the including translation unit, so under `RN_STRICT_API` any app or library including them hits the public module's `UmbrellaGuard.h` `#error`. Switch them to the module umbrellas:

- iOS `RCTCallInvoker.h`, `RCTBridgeProxy+Cxx.h`: `<React/CallInvoker.h>`; `NSDataBigString.h`: `<React/JSBigString.h>`.
- Android `react/fabric/AnimatedPropBufferEncoder.h`: `<React/RendererCore.h>`; `react/runtime/jni/JJSTimerExecutor.h`, `JReactInstance.h`: `<React/RuntimeExecutor.h>`.
- ReactCxxPlatform `ImageLoaderModule.h`, `NativeExceptionsManager.h`: `<React/Bridging.h>`; `IMountingManager.h`, `RunLoopObserverManager.h`: `<React/RendererCore.h>`; `ReactHost.h`: `<React/CallInvoker.h>`, `<React/NativeModuleCore.h>`; `ReactInstanceConfig.h`: `<React/Debug.h>`.

Each umbrella is a superset of the header it replaces, so no declarations are lost. Includes of "for frameworks" headers stay direct. The guards are inert without `RN_STRICT_API`.

Changelog: [Internal]

Reviewed By: christophpurrer

Differential Revision: D124323428
@coado
coado force-pushed the export-D124323428 branch from f42d2c9 to 452305e Compare October 13, 2026 08:43
coado added a commit to coado/react-native that referenced this pull request Oct 13, 2026
react#59026)

Summary:
Pull Request resolved: react#59026

Several exported headers without a stable API guard included fine-grained headers of public modules directly. They are preprocessed in the including translation unit, so under `RN_STRICT_API` any app or library including them hits the public module's `UmbrellaGuard.h` `#error`. Switch them to the module umbrellas:

- iOS `RCTCallInvoker.h`, `RCTBridgeProxy+Cxx.h`: `<React/CallInvoker.h>`; `NSDataBigString.h`: `<React/JSBigString.h>`.
- Android `react/fabric/AnimatedPropBufferEncoder.h`: `<React/RendererCore.h>`; `react/runtime/jni/JJSTimerExecutor.h`, `JReactInstance.h`: `<React/RuntimeExecutor.h>`.
- ReactCxxPlatform `ImageLoaderModule.h`, `NativeExceptionsManager.h`: `<React/Bridging.h>`; `IMountingManager.h`, `RunLoopObserverManager.h`: `<React/RendererCore.h>`; `ReactHost.h`: `<React/CallInvoker.h>`, `<React/NativeModuleCore.h>`; `ReactInstanceConfig.h`: `<React/Debug.h>`.

Each umbrella is a superset of the header it replaces, so no declarations are lost. Includes of "for frameworks" headers stay direct. The guards are inert without `RN_STRICT_API`.

Changelog: [Internal]

Reviewed By: christophpurrer

Differential Revision: D124323428
@coado
coado force-pushed the export-D124323428 branch from 452305e to 444453b Compare October 13, 2026 08:48
@meta-codesync meta-codesync Bot changed the title Reach public modules through umbrellas from unguarded exported headers (#59026) Reach public modules through umbrellas from unguarded exported headers Oct 13, 2026
@coado
coado force-pushed the export-D124323428 branch from 444453b to 6a7e5b0 Compare October 13, 2026 15:54
Summary:
Several exported headers without a stable API guard included fine-grained headers of public modules directly. They are preprocessed in the including translation unit, so under `RN_STRICT_API` any app or library including them hits the public module's `UmbrellaGuard.h` `#error`. Switch them to the module umbrellas:

- iOS `RCTCallInvoker.h`, `RCTBridgeProxy+Cxx.h`: `<React/CallInvoker.h>`; `NSDataBigString.h`: `<React/JSBigString.h>`.
- Android `react/fabric/AnimatedPropBufferEncoder.h`: `<React/RendererCore.h>`; `react/runtime/jni/JJSTimerExecutor.h`, `JReactInstance.h`: `<React/RuntimeExecutor.h>`.
- ReactCxxPlatform `ImageLoaderModule.h`, `NativeExceptionsManager.h`: `<React/Bridging.h>`; `IMountingManager.h`, `RunLoopObserverManager.h`: `<React/RendererCore.h>`; `ReactHost.h`: `<React/CallInvoker.h>`, `<React/NativeModuleCore.h>`; `ReactInstanceConfig.h`: `<React/Debug.h>`.

Each umbrella is a superset of the header it replaces, so no declarations are lost. Includes of "for frameworks" headers stay direct. The guards are inert without `RN_STRICT_API`.

With `use_frameworks!`, a `<React/...>` umbrella lives only in its owning pod's framework headers, which CocoaPods adds to dependents' search paths only for pods in `ReactNativePodsUtils.stable_umbrella_frameworks`. React-Core now reaches the `React-cxxreact` and `React-callinvoker` umbrellas, so add both pods to that list; otherwise the dynamic frameworks build fails with `'React/JSBigString.h' file not found`.

Changelog: [Internal]

Reviewed By: christophpurrer

Differential Revision: D124323428
@coado
coado force-pushed the export-D124323428 branch from 6a7e5b0 to 29f9fc6 Compare October 13, 2026 16:00

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. meta-exported p: Facebook Partner: Facebook p: Software Mansion Partner: Software Mansion Partner

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant