Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37681
User who run their applications using `npx react-native ios` have the application going into the
background if there is inactivity on the device. This is common for users developing on device (why touch
the device if you're tweaking background colours, etc...).
If the application is build with Xcode directly, this is already managed. This change prevents the idle
timer from running in DEBUG builds.
## Changelog:
[iOS][Fixed] - Debug builds from cli disable idle to stop application going into background
Reviewed By: cipolleschi
Differential Revision: D46427401
fbshipit-source-id: 45969cd506a1b76bde3be81d27808bf0e792a817
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37685
I'm backporting this comming `60a452b4853dc5651c465867344904dd6fc86703`
from the release branch of 0.72-stable to main which fixes this issue
in the Android NDK:
https://github.com/android/ndk/issues/1740#issuecomment-1198438260
Changelog:
[Internal] [Changed] - Backport Hermes release fix on `main`
Reviewed By: mdvacca
Differential Revision: D46398346
fbshipit-source-id: 593ca9523cb223e7c2d9fe6cccc1abb3ed331203
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37309
### Stack
ARIA roles in React Native are implemented on top of accessibilityRole. This is lossy because there are many more ARIA roles than accessibilityRole. This is especially true for RN on desktop where accessibilityRole was designed around accessibility APIs only available on mobile.
This series of changes aims to change this implementation to instead pass the ARIA role to native, alongside any existing accessibilityRole. This gives the platform more control in exactly how to map an ARIA role to native behavior.
As an example, this would allow mapping any ARIA role to AutomationControlType on Windows without needing to fork to add new options to accessibilityRole.
It also allows greater implementation flexibility for other platforms down the line, but for now, iOS and Android behave the same as before (though with their implementation living in native).
### Diff
This enables the `role` prop in iOS. ARIA role strings become convertible to `UIAccessibilityTrait`, which is the sink of most of the roles. We keep a list of traits derived from `role` vs `accessibilityRole` on the view, then inval and apply the result any time the prop for either is set.
Changelog: [Internal]
Reviewed By: sammy-SC
Differential Revision: D45432530
fbshipit-source-id: ced5be06e319c0b967d7511293e14e05147e5759
Summary:
If an accessible link is ellipsized out of being rendered, the AccessibilityDelegate will still attempt to populate an accessibility node for it; doing so results in an invalid request to a TextLayout API, however, causing a crash. This crash occurs as soon as the element is rendered, so long as a Screen Reader (or app using similar a11y APIs) is enabled. This change uses a technique similar to those existing to make the node "blank" in such cases, so Talkback can filter it out—and, more importantly, not crash.
## Changelog:
[Android] [Fixed] - Fix links hidden via ellipsis crashing screen readers
Pull Request resolved: https://github.com/facebook/react-native/pull/37050
Test Plan:
- Added a block to the "Accessibility Android APIs" page in the rn-tester app. Without the changes to `ReactAccessibilityDelegate`, this component crashes the app; with the changes, the component renders without problem.
- You can also see the crash "in the wild" using [this Expo Snack](https://snack.expo.dev/dhleong/2d1407) that I put together when trying to isolate this issue.
Reviewed By: rshest
Differential Revision: D46206673
Pulled By: NickGerleman
fbshipit-source-id: 0eb3e735202ee6be5f931bbb4bb92c24e7458ea6
Summary:
This diff fixes more bad type definitions that are previously hidden but will be exposed in the upcoming Flow 0.208.0
Changelog: [Internal]
Reviewed By: panagosg7
Differential Revision: D46382788
fbshipit-source-id: 50337ce5bc0f07ac5916a2d4b75eabf5e8e2e427
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37657
changelog: [internal]
Make React-debug into its own pod to align BUCK and cocoapods.
This is needed to reland RuntimeScheduler in the old architecture on iOS.
Reviewed By: rickhanlonii
Differential Revision: D46357876
fbshipit-source-id: 035aaaee8b4b106f873b4b30c8cb424867be066a
Summary:
When reverting the runtimescheduler fix, we forgot to remove some lines from the React-Fabric dependencies. This broke pod install and we have a red ci since then.
bypass-github-export-checks
## Changelog:
[iOS][Fixed] - fix React-Fabric dependencies
Pull Request resolved: https://github.com/facebook/react-native/pull/37652
Test Plan: CircleCI is green
Reviewed By: cipolleschi
Differential Revision: D46349504
Pulled By: sammy-SC
fbshipit-source-id: 8fc1bca7838a913adba702033d06dd02b93c31f9
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37646
I'm re-enabling a test that got disabled due to us not using mock-maker-inline in OSS. I'm also adding `mock-maker-inline` for OSS so it will be easier to convert tests to Kotlin as classes in Kotlin are final by default.
Changelog:
[Internal] [Changed] - Enable mock-maker-inline for Android JVM tests
Reviewed By: NickGerleman
Differential Revision: D46222913
fbshipit-source-id: b7da0616994888c2800c193a1bb8e233d2c18288
Summary:
The TurboModule interop layer on iOS will ship with a Bridge proxy.
The Bridge proxy is an object (see D46084318) that will try to simulate the Bridge's APIs, whenever possible, by delegating to Bridgeless abstractions.
## Changes
**Fact:** All FBiOS modules work with/without the bridge.
So, let's break down the Interop layer test group (i.e: interop on) into two groups:
- interop on, bridge proxy off
- interop on, bridge proxy on
## Benefits
This will speed up the production test, by allowing us to:
1. Isolate Interop issues to the bridge proxy faster.
2. Stabilize the TurboModule interop layer faster.
NOTE: This flag is temporary, and should be removed long-term: The TurboModule interop layer should ship with the bridge proxy enabled by default.
Changelog: [Internal]
Reviewed By: philIip
Differential Revision: D46088752
fbshipit-source-id: 1e161d49382635a44194166645c1a5d56d37b4de
Summary:
## Context
Product code can query the Bridge, or the TurboModuleManager, to see whether a native module has been initialized or not. But, this API doesn't exist in RCTModuleRegistry.
## Changes
This diff exports moduleIsInitialized: from RCTModuleRegistry. That way, RCTBridgeProxy (introduce in D46088752) can more easily implement the moduleIsInitialized: API.
Changelog:
[iOS][Added] - Introduce RCTModuleRegistry moduleIsInitialized:
Reviewed By: cortinico
Differential Revision: D46166548
fbshipit-source-id: c9954273e511083276aeb911dd58719cf4a11f10
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37643
We needed this change for offline mirrors which we don't use anymore, so we can remove
this extra dependency (it will make the build a little faster also which is never bad).
Changelog:
[Internal] [Changed] - Remove unnecessary dependency on aapt2-linux
Reviewed By: mdvacca
Differential Revision: D46318725
fbshipit-source-id: a86b43fff6a11844acff88791af0578d79d7fdbf
Summary:
As far as I'm aware, there's no way to know/guarantee whether a JavaScript callback can throw an exception or not.
So, all UIManager methods that synchronously invoke JavaScript callbacks cannot use noexcept.
If they do use noexcept, and the JavaScript callback (i.e: product code) throws an exception, the app will crash.
Changelog: [Internal]
Created from CodeHub with https://fburl.com/edit-in-codehub
Reviewed By: javache
Differential Revision: D46122985
fbshipit-source-id: 2f4356c7dbab1b3a5e0549f58e73f6de1b626ce9
Summary:
In this diff I analyzed bolts.Task class to ensure it's ready to be used from kotlin.
I won't convert bolts.Task to kotlin, but this is necessary to be able to convert its callsites (ReactHost) to kotlin
This is a 'continuation' of the previous diff, I splitted in 2 because Task is a very large class and it's worth analyzing separately.
bypass-github-export-checks
changelog: [internal] internal
Reviewed By: cortinico
Differential Revision: D46194126
fbshipit-source-id: 765af7683fa62814747c7d8516d311cffabac3c1
Summary:
In this diff I analyzed bolts library to ensure it's ready to be used from kotlin.
I won't convert bolts to kotlin, but this is necessary to be able to convert its callsites (ReactHost) to kotlin
bypass-github-export-checks
changelog: [internal] internal
Reviewed By: fkgozali
Differential Revision: D46194127
fbshipit-source-id: 609e356230b1c87fe26571b811d23430d0168276
Summary:
Native error: `Declaration of 'atomic_bool' must be imported from module 'std.atomic' before it is required.`
## Changelog:
[IOS] [FIXED] - Add missing `atomic` import
Pull Request resolved: https://github.com/facebook/react-native/pull/37621
Test Plan: This build error appears to only occur when other build errors occur, but it supersedes the other build errors, increasing the difficulty of debugging the root build error(s).
Reviewed By: NickGerleman
Differential Revision: D46284208
Pulled By: sammy-SC
fbshipit-source-id: b36cb3a9166b1e7cef0121a2e635a191bd7c3a5e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37522
This diff adds cross-platform Cxx binding helper and iOS specific implementation of `__nativeComponentRegistry__getNativeViewConfig` to JS runtime. This function provides native view config for a native component in bridgeless mode.
Changelog:
[Internal] - Introduce `__nativeComponentRegistry__getNativeViewConfig` in iOS.
Reviewed By: javache
Differential Revision: D43538804
fbshipit-source-id: 0aeca40c1c2a625eca5d60e466eb24df30453ba7
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37410
Incremental adoption of new bridgeless API's, where they are semantically equivalent to the old one.
Changelog: [Internal]
Reviewed By: christophpurrer
Differential Revision: D45736529
fbshipit-source-id: e41f6840e7c329f6051530e53773fae760584842
Summary:
In Xcode projects with multiple targets, and in particular when targets are for different platforms (e.g. iOS and macOS), Cocoapods may add a suffix to a Pod name like `React-Core`.
When this happens, the code in `new_architecture.rb` (which was looking for a pod with exact name `React-Core`) would not add the preprocessor definitions for Fabric as expected.
This change fixes this issue. Fixes https://github.com/facebook/react-native/issues/37102 .
## Changelog:
[iOS] [Fixed] - Fix Fabric issue with React-Core pod when Xcode project has multiple targets
Pull Request resolved: https://github.com/facebook/react-native/pull/37581
Test Plan: Tested that this change fixes this issue which occurs 100% of the time in React Native TV projects.
Reviewed By: dmytrorykun
Differential Revision: D46264704
Pulled By: cipolleschi
fbshipit-source-id: 8dfc8e342b5a110ef1f028636e01e5c5f2b6e2f0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37614
changelog: [internal]
We do not control what `vImageBoxConvolve_ARGB8888` returns, it may return 0. If it does return 0, we will allocate memory chunk of size 0. Yes, malloc will let you do that. Well, it depends on the implementation, but according to the spec it is legal. The only requirement is to by able to call free on that without crash.
If `vImageBoxConvolve_ARGB8888` does return 0 and we allocate memory of size 0. Call to `vImageBoxConvolve_ARGB8888` with tempBuffer of size 0 will lead to a crash.
[The documentation](https://developer.apple.com/documentation/accelerate/1515945-vimageboxconvolve_argb8888#discussion) for `vImageBoxConvolve_ARGB8888` and tempBuffer states:
> To determine the minimum size for the temporary buffer, the first time you call this function pass the kvImageGetTempBufferSize flag. Pass the same values for all other parameters that you intend to use in for the second call. The function returns the required minimum size, which **should be a positive value**. (A negative returned value indicates an error.) The kvImageGetTempBufferSize flag prevents the function from performing any processing other than to determine the minimum buffer size.
I think the keyword word there is "should be a positive value". 0 is not a positive value.
Reviewed By: javache, yungsters
Differential Revision: D46263204
fbshipit-source-id: baa8fac5b3be6fb5bed02800cd725cc4cf43485a
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37572
Currently, RNTester was using a completely custom AppDelegate and not leveraging the RCTAppDelegate we use in the OSS. This resulted in a misalignment between the two setups and duplicated work to test stuff internally furst and then in the OSS, with some more time needed to understand why one setup was working and the other wasn't.
With this change, we are aligning the two, bringing RNTester closer to the OSS setup. There are still small differences, but we can iterate over those.
## Changelog:
[iOS][Changed] - Make RNTester use RCTAppDelegate
Reviewed By: cortinico
Differential Revision: D46182888
fbshipit-source-id: 7c55b06de1a317b1f2d4ad0d18a390dc4d3356a4
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37609
changelog: [internal]
Moving LayoutMetrics and LayoutPrimitives from core to graphics module.
This is to enable different implementation for different platforms.
Reviewed By: rubennorte
Differential Revision: D45904748
fbshipit-source-id: a4e666d7c7390e87abdb09235f96655b63f451f9
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37598
changelog: [internal]
This diff does three things:
- Makes dependency on `mapbuffer:jni` explicit for modules that were accessing it through `react:utils` module.
- `renderer:core` now depends on `mapbuffer:mapbuffer`.
- Moved `PropsMapBuffer` inside of `Props`.
Reviewed By: rubennorte
Differential Revision: D46223390
fbshipit-source-id: 2dca1a034f991afd3e9531c4c7fcc7b99239dabe
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37588
The `const` modified in UIManagerCommitHook prevents us from mutating the commit hook itself (which doesn't make any sense as commit hooks might want to update their internal state as response to new commits).
This removes the constraint so we can remove the `const` modifier from `MutationObserverManager` in a future diff.
Changelog: [internal]
Reviewed By: sammy-SC
Differential Revision: D46149085
fbshipit-source-id: d3bf24f1125ad3878ca36a6ceb9dd509c3cf7b1e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37460
## Context
This implements the concept of mount hooks in UIManager which, similarly to commit hooks, receive a notification when a root shadow tree has been mounted in the host platform.
This is meant to be used internally in React Native, not by user-land libraries or products.
This will be used to implement `IntersectionObserver` in a following diff.
Changelog: [Internal]
Reviewed By: javache, sammy-SC
Differential Revision: D45866244
fbshipit-source-id: 4df48bf237a5cc89e37709faaeaa0ce582c0d0cc
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37461
This adds a feature flag to dispatch state updates for scroll position in every scroll position update in iOS, as opposed to only at the beginning, end and other specific moments.
This is necessary to implement features like `IntersectionObserver`, but we want to test the performance impact of this change before rolling it out completely.
Changelog: [internal]
Reviewed By: javache
Differential Revision: D45916675
fbshipit-source-id: 00a2b1c5ea03e45141bb2d81e4e5fb8c198de1ff
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37435
We're implementing the `IntersectionObserver` API in React Native. That API reports the bounding rectangle of the root node and the target node (which we already implement in React Native via `LayoutableShadowNode::computeRelativeLayoutMetrics`), plus the intersection rectangle.
This adds a new option in `LayoutInspectingPolicy` so we can get the layout metrics when clipping is applied (e.g.: if a parent node has `overflow: hidden` and we get the layout metrics of one of its children that extends beyond the limits of the parent, it would report only the rectangle that's visible for that node).
Changelog: [internal]
Reviewed By: sammy-SC
Differential Revision: D45866245
fbshipit-source-id: ed3bfc2021e6b7819b8efea6fa3a81ed9d0bb181
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37436
When testing the reported intersections from `IntersectionObserver` I realized that the reported rectangles were incorrect when using `scale` in a parent. This is because `scale` transforms use the center of the node as the origin, and when applying the transform on its children we were using the center of the children instead of the center of the same node.
This fixes that issue by using the center of the parent when applying the transform on the children.
Changelog: [General][Fixed] - Fixed computation of layout via `ref.measureRelative` and `ref.measureInWindow` for nodes with scale/rotate transforms in their parents.
Reviewed By: sammy-SC
Differential Revision: D45866231
fbshipit-source-id: 68928cbaca28c21155657d276cf8ddd2129d9668
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37434
We'll be using this method in IntersectionObserver to avoid having to get the list of ancestor multiple times when calling computeRelativeLayoutMetrics for the target bounding rect and for the intersection rect.
Changelog: [Internal]
Reviewed By: sammy-SC
Differential Revision: D45866232
fbshipit-source-id: 0efa165b780e819bf19028fecd22b303ca6f52ad
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37595
Following D46097200, the integration between Hermes and Xcode got broken as Hermes is creating the framework in a different folder.
This is a patch to unblock people internally to build RNTester with Hermes and to run it on a simulator.
We should find a way to parametrize this, passing the target from Xcode to this script, after checking where Hermes is built
## Changelog:
[internal] - Fix RNTester-Hermes-Xcode integration for testing locally on simulators
Reviewed By: dmytrorykun
Differential Revision: D46224915
fbshipit-source-id: 9d682983c7990f8efa7c07f62191782dce317cbb
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37589
In D44221018, I changed this to return a ref to the smart pointer, and even made it a raw pointer in D45948987, but this is not thread-safe: the uninstallFabricUIManager happens on a different thread from the accesses to these pointers on the JS thread, so we actually need to use the shared pointer here to be safe.
Changelog: [Internal]
Reviewed By: sammy-SC
Differential Revision: D46221511
fbshipit-source-id: d8080042d6f1dbf5550a09b77f1090f78ec82455
Summary:
changelog: [internal]
`setNativeState` is not implemented in JSC. Let's stick to host objects for now.
Reviewed By: cipolleschi
Differential Revision: D46193786
fbshipit-source-id: 9d36801bb9faa5c144a461bcbe623762bf6947b1
Summary:
Attempting to fix the issue https://github.com/facebook/react-native/issues/33418
## Changelog
<!-- Help reviewers and the release process by writing your own changelog entry.
Pick one each for the category and type tags:
[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message
For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->
[ANDROID] Fixed inconsistent styling for text nodes with many children
Pull Request resolved: https://github.com/facebook/react-native/pull/36656
Test Plan:
No test plan yet. I'd like to ask for help with creating one.
##
Putting template aside, I'd like to ask for a review of the approach I'm suggesting.
React Native as-is (at least in some cases) [messes up the styles](https://github.com/facebook/react-native/issues/33418#issuecomment-1485305556) for text nodes with more than 85 children, just like that.

All of this text should be blue.
The root cause is that code (on Android) assumes it can assign as many `Spannable` span priority values as we'd like, while in reality, it has to be packed in an 8-bit-long section of the flags mask. So 255 possible values. In the scenario I produced, React generates three spans per text node, and for 85 text nodes, it sums up to 255. For each span, a new priority value is assigned.
As I understand it, we don't need that many priority values. If I'm not mistaken, these priorities are crucial only for ensuring that nested styles have precedence over the outer ones. I'm proposing to calculate the priority value "vertically" (based on the node's depth in the tree) not "horizontally" (based on its position).
It would be awesome if some core engineer familiar with `ReactAndroid` shared their experience with this module, especially if there are any known cases when we _know_ that we'd like to create overlapping spans fighting over the same aspects of the style.
Reviewed By: cortinico
Differential Revision: D46094200
Pulled By: NickGerleman
fbshipit-source-id: aae195c71684fe50469a1ee1bd30625cbfc3622f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37541
This diff makes changes to emit bubbling click events (i.e. [these](https://www.w3.org/TR/uievents/#click)) based on the existing pointer-down/pointer-up events. As per the [pointer events spec](https://www.w3.org/TR/pointerevents3/#the-click-auxclick-and-contextmenu-events), click events are still dispatched as PointerEvents (i.e. conform to the PointerEvent interface).
Changelog: [Internal] [Added] - W3CPointerEvents: emit click events based on pointerDown/pointerUp
Reviewed By: NickGerleman
Differential Revision: D45666344
fbshipit-source-id: 08829d3a24fef6851c1c3c29d4fa51b31ec68931
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37570
If a TM calls a completion callback, or resolves or rejects a promise multiple times, a C++ exception is thrown.
For an in the wild crash, we are getting this signal as:
1. `libdispatch` calls std::terminate while pumping a thread's message queue
2. The hooked FB app termination handler is called, which introspects for the currently handled exception
4. We are handling this TurboModule C++ exception being thrown, suggesting `libdispatch` termination may be due to catching this C++ exception which was not otherwise handled
4. We have by this point lost the stack trace of the code invoking the callback
I think if we change the timing of `abort()` to when the callback is called, we might be able to preserve the stack trace of module code calling the callback.
Reviewed By: javache
Differential Revision: D46175685
fbshipit-source-id: 680aa9aa5e4ca6d8dd04dfe34ec870b86c7640ef
Summary:
The TurboModule interop layer causes a surge in "module not found" exceptions: T154044825.
After D45102812, this exception **should** have included debug info. But, it didn't.
## Problems
So, there are two problems:
1. No debug logs are getting printed.
2. In the TurboModule interop test group, global.RN$TurboInterop is false **for some reason.** This is **very** strange.
## Changes
1. **Always** print the debug logs.
2. Add more flag-related debug information to the "module not found" debug logs. This will help us validate whether global.RN$TurboInterop is truely false.
## Concerns
> **Always** print the debug logs on Android.
**Question:** Won't this be really expensive?
This shouldn't be too expensive: There are about ~50 native module requires in Fb4a. So: (1) the exception message shouldn't grow to an unreasonable size, (2) we'll only use enough memory to store ~50 strings in the JS VM.
Changelog: [Internal]
Reviewed By: fkgozali
Differential Revision: D46195117
fbshipit-source-id: 8215c7339d16a1adc063b674805063865d1f7ab6
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37537
Changelog: [Internal] [Changed] - W3CPointerEvents: add missing attributes to pointer events
The [PointerEvent interface](https://www.w3.org/TR/pointerevents/#pointerevent-interface) includes some additional properties which we weren't including in the events we dispatched.
This diff adds them (set to default values):
- twist
- tangentialPressure
In the future, we can try to set reasonable values for these properties based on the underlying native events.
Reviewed By: NickGerleman
Differential Revision: D45747033
fbshipit-source-id: 529f9d90299f33bc04eae3fb85ddd7eac3d61c5b