Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45727
All instances mirror types which are already defined in the platform-independent base module. See snapshot changes.
Changelog: [Internal]
Reviewed By: GijsWeterings
Differential Revision: D60286148
fbshipit-source-id: 30665252ff5e449a2c10ff3a3e76d9337daecb80
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45640
Other two libraries that don't need to be dynamic libraries but can just be exposed via libreactnative.so
Changelog:
[Internal] [Changed] - Move react_featureflags and react_render_consistency inside libreactnative.so
Reviewed By: cipolleschi
Differential Revision: D55796945
fbshipit-source-id: be40b1523a560b2783fc7b6312326e20dc8cf595
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/43909
As we're moving towards a single `libreactnative.so` file, we need to remove several of our prefab targets. Here I'm cleaning up those that are not having an OnLoad.cpp file which needs to be loaded from SoLoader.
This is breaking for libraries using native dependencies via Prefab (i.e. search for `ReactAndroid::` in CMakeLists.txt files for your project).
If so, the CMakeLists.txt files should be updated as follows:
```diff
- ReactAndroid::react_render_debug
+ ReactAndroid::reactnative
```
This applies to every prefab dependencies (the example is just for `react_render_debug`
Changelog:
[General] [Breaking] - Remove several libs from default App CMake setup
Reviewed By: cipolleschi
Differential Revision: D55751683
fbshipit-source-id: 3aca7897852b5f323d60ede3c5036cae2f81e6c3
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/43908
This creates a new dynamic library that we want to be the only .so that is loaded from apps/libraries.
Changelog:
[Internal] [Changed] - Create the libreactnative.so dependency
Reviewed By: cipolleschi
Differential Revision: D55751682
fbshipit-source-id: 50f4167dc2f9953a8673b28dba3357e19fe88d6b
Summary:
https://github.com/facebook/react-native/issues/45596
Migrated all the assertions to use `assertThat()` function from AssertJ.
Also updated the `prepareBoostTask_withMissingConfiguration_fails` test to use `assertThatThrownBy` to check if the tested task throws a given exception.
## Changelog:
Migrate tests to assertj in these files:
- `packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareBoostTaskTest.kt`
[INTERNAL] [CHANGED] - Migrated PrepareBoostTaskTest from junit.Assert to assertj.core.api.Assertions.
For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
Pull Request resolved: https://github.com/facebook/react-native/pull/45718
Test Plan:
All tests pass when `./gradlew -p packages/gradle-plugin test` command is ran.
<img width="454" alt="image" src="https://github.com/user-attachments/assets/9e954f7b-2208-48a9-ae15-ab642252e6da">
Reviewed By: GijsWeterings
Differential Revision: D60284566
Pulled By: cortinico
fbshipit-source-id: 11af0a0ca574f935e6aab3a7855b5daaeab1a718
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45701
# Changelog: [Internal]
One weird thing is that this test actually never runs for Android, so its only compiled. I am not sure why exactly this one produces an error during execution, given that the next test is almost identical.
Nothing valuable from logcat, just a `SIGSEGV`. Since its something with memory, I've tried calling `unsubscribe`, same as in the next test to free memory before the test tear down (which should not run, because this test doesn't run).
Reviewed By: dmytrorykun
Differential Revision: D60282464
fbshipit-source-id: 2c7760f02c1128083f28651fe8ecd0f3cee27715
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45578
# Changelog: [Internal]
Use previously introduced native module for managing the presence of warning notifications in LogBox:
- Don't display warnings and Fusebox migration message if there is an active debugging session
- If the session has just been started, clear warnings to hide Fusebox migration message
- If there is no active debugging session (even if there were some at some point of Host lifetime), display Fusebox migration message
See demo in test plan.
Reviewed By: huntie
Differential Revision: D59975265
fbshipit-source-id: 87d91b4d7f3c825dc795ec1b5b3073f969bc7b60
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45577
# Changelog: [Internal]
This diff adds new native module, which can be used from JavaScript.
The API includes:
1. `hasActiveSession`: returns a boolean flag, which can be used for determining if 1 or more debugging sessions are active for current HostTarget.
2. `subscribe`: receives a callback, which will be executed once the debugging state changes. To be more precise, this will only be called when state is changing from no active sessions to 1 session or the other way around. Callback should expect to receive one boolean argument, which can be used for determining if there is an active session.
Reviewed By: huntie
Differential Revision: D59975264
fbshipit-source-id: dd095954529f573f38e9fae1792465a59e639d23
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45670
**Motivation**
There is a special [code path](https://github.com/facebook/react-native/blob/bb23026daf1a853f4482be46d6f242712a6b7330/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/FrameBasedAnimationDriver.java#L98) for native driven looping animations that restarts the animation in native, never calling the "animation end" callback. This was designed for and works fine with the `Animated.loop(Animated.timing(...))` animations. Unfortunately, it doesn't work well with more complex animations.
Consider an `Animated.loop(Animated.sequence(Animated.timing(...)))` animation. It doesn't trigger this code path. Instead, its nested `Animated.timing` animations are continuously rescheduled from JS by the looping `Animated.sequence` as singular native driven animations. Each time they end, they fire their "animation end" callback.
This introduces a subtle breakage when those "animation end" callbacks trigger React to update its state. This in turn restarts the rendering. In case with long transitions such looping animations can restart the rendering multiple times. In worst cases it may render the app unresponsive.
**Solution**
We don't need to tell React to update its state when running looping animations. This diff introduces a mechanism, using which `Animated.loop` can tell its nested animations that they are in a loop, and and there's no need to send state updates when they finish. This is consistent with how `Animated.loop(Animated.timing(...))` behaves.
Changelog: [General][Breaking] - Looping animations will not send React state updates.
Facebook
This diff enables this new behaviour for IGVR and FBVR, it also set up the experiment for FBiOS and FB4a.
Reviewed By: javache
Differential Revision: D59970265
fbshipit-source-id: 4832ae05b82f6cc59f92f72305b68610fa422f0a
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45638
When looping a frame-based animation, we want to make sure to use the latest frame from the easing curve, which may not necessarily match `mToValue`.
Changelog: [Internal]
Differential Revision: D60143746
fbshipit-source-id: 68fa5421a958acc8291f396bc9f263fa110fdc54
Summary:
As explained in https://github.com/facebook/react-native/issues/45280, `TSan` picks up data races related to concurrent read/write to fields in `RCTCxxBridge`. See this report for reference:
```
WARNING: ThreadSanitizer: data race (pid=19983)
Write of size 1 at 0x00010af1dfd8 by thread T13:
#0 -[RCTCxxBridge _flushPendingCalls] <null> (RNTesterUnitTests:arm64+0x42b484)
https://github.com/facebook/react-native/issues/1 __53-[RCTCxxBridge executeSourceCode:withSourceURL:sync:]_block_invoke <null> (RNTesterUnitTests:arm64+0x426050)
https://github.com/facebook/react-native/issues/2 decltype(std::declval<void () block_pointer __strong&>()()) std::__1::__invoke[abi:ue170006]<void () block_pointer __strong&>(&&, decltype(std::declval<void () block_pointer __strong&>()())&&...) <null> (RNTesterUnitTests:arm64+0x456298)
https://github.com/facebook/react-native/issues/3 std::__1::__function::__func<void () block_pointer __strong, std::__1::allocator<std::__1::allocator>, void ()>::operator()() <null> (RNTesterUnitTests:arm64+0x455c6c)
https://github.com/facebook/react-native/issues/4 std::__1::__function::__value_func<void ()>::operator()[abi:ue170006]() const <null> (RNTesterUnitTests:arm64+0x3ce2e4)
https://github.com/facebook/react-native/issues/5 std::__1::function<void ()>::operator()() const <null> (RNTesterUnitTests:arm64+0x3cdfd0)
https://github.com/facebook/react-native/issues/6 facebook::react::tryAndReturnError(std::__1::function<void ()> const&) <null> (RNTesterUnitTests:arm64+0x4af18c)
https://github.com/facebook/react-native/issues/7 facebook::react::RCTMessageThread::tryFunc(std::__1::function<void ()> const&) <null> (RNTesterUnitTests:arm64+0x51595c)
https://github.com/facebook/react-native/issues/8 facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1::operator()() const <null> (RNTesterUnitTests:arm64+0x529df0)
https://github.com/facebook/react-native/issues/9 decltype(std::declval<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&>()()) std::__1::__invoke[abi:ue170006]<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&>(facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&) <null> (RNTesterUnitTests:arm64+0x529b54)
https://github.com/facebook/react-native/issues/10 void std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ue170006]<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&>(facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&) <null> (RNTesterUnitTests:arm64+0x529978)
https://github.com/facebook/react-native/issues/11 std::__1::__function::__alloc_func<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1, std::__1::allocator<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1>, void ()>::operator()[abi:ue170006]() <null> (RNTesterUnitTests:arm64+0x5298dc)
https://github.com/facebook/react-native/issues/12 std::__1::__function::__func<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1, std::__1::allocator<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1>, void ()>::operator()() <null> (RNTesterUnitTests:arm64+0x524518)
https://github.com/facebook/react-native/issues/13 std::__1::__function::__value_func<void ()>::operator()[abi:ue170006]() const <null> (RNTesterUnitTests:arm64+0x3ce2e4)
https://github.com/facebook/react-native/issues/14 std::__1::function<void ()>::operator()() const <null> (RNTesterUnitTests:arm64+0x3cdfd0)
https://github.com/facebook/react-native/issues/15 invocation function for block in facebook::react::RCTMessageThread::runAsync(std::__1::function<void ()>) <null> (RNTesterUnitTests:arm64+0x515384)
https://github.com/facebook/react-native/issues/16 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ <null> (CoreFoundation:arm64+0x8dc0c)
https://github.com/facebook/react-native/issues/17 __NSThread__start__ <null> (Foundation:arm64+0x645c60)
Previous read of size 1 at 0x00010af1dfd8 by main thread:
#0 -[RCTCxxBridge isLoading] <null> (RNTesterUnitTests:arm64+0x43236c)
https://github.com/facebook/react-native/issues/1 -[RCTBridge isLoading] <null> (RNTesterUnitTests:arm64+0x3c0170)
https://github.com/facebook/react-native/issues/2 -[RCTComponentPropsTests setUp] <null> (RNTesterUnitTests:arm64+0xe6f34)
https://github.com/facebook/react-native/issues/3 __70-[XCTestCase _shouldContinueAfterPerformingSetUpSequenceWithSelector:]_block_invoke.134 <null> (XCTestCore:arm64+0x540d8)
Location is heap block of size 384 at 0x00010af1de80 allocated by main thread:
#0 calloc <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x4fc30)
https://github.com/facebook/react-native/issues/1 _malloc_type_calloc_outlined <null> (libsystem_malloc.dylib:arm64+0xf488)
https://github.com/facebook/react-native/issues/2 -[RCTBridge initWithDelegate:bundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc540)
https://github.com/facebook/react-native/issues/3 -[RCTBridge initWithBundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc124)
https://github.com/facebook/react-native/issues/4 -[RCTComponentPropsTests setUp] <null> (RNTesterUnitTests:arm64+0xe6b3c)
https://github.com/facebook/react-native/issues/5 __70-[XCTestCase _shouldContinueAfterPerformingSetUpSequenceWithSelector:]_block_invoke.134 <null> (XCTestCore:arm64+0x540d8)
Thread T13 (tid=11290378, running) created by main thread at:
#0 pthread_create <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x2bee4)
https://github.com/facebook/react-native/issues/1 -[NSThread startAndReturnError:] <null> (Foundation:arm64+0x6458f0)
https://github.com/facebook/react-native/issues/2 -[RCTBridge setUp] <null> (RNTesterUnitTests:arm64+0x3bf748)
https://github.com/facebook/react-native/issues/3 -[RCTBridge initWithDelegate:bundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc540)
https://github.com/facebook/react-native/issues/4 -[RCTBridge initWithBundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc124)
https://github.com/facebook/react-native/issues/5 -[RCTComponentPropsTests setUp] <null> (RNTesterUnitTests:arm64+0xe6b3c)
https://github.com/facebook/react-native/issues/6 __70-[XCTestCase _shouldContinueAfterPerformingSetUpSequenceWithSelector:]_block_invoke.134 <null> (XCTestCore:arm64+0x540d8)
```
In order to fix the data races, `std::atomic` instead of primitive boolean types.
In order to reproduce my findings and verify fix:
* Clone this branch
* Run setup code as described in README
* Execute `git revert -n 11c09fdc7c442dd694909bebbbc8f21c3e69edf2`.
* Enable TSan for both RNTester and its test scheme.
* Enable Runtime issue breakpoint for TSan
* Run unit tests
* Observe the TSan breakpoint is hit (possibly other places in the codebase as well) when accessing `_loading`, `_moduleRegistryCreated`, and `_valid`.. Continue execution if other breakpoints are hit before this breakpoint.
* Execute git revert --abort
* Run the tests again and observe the TSan breakpoint does not hit said code again.
NB! While this will fix data races, it will not fix potential race conditions. I have not encountered bugs related to race conditions in `RCTCxxBridge`, but given the nature of how it is made use of concurrently, it is, in my opinion, plausible.
## Changelog:
[iOS][Fixed] Use std::atomic for eliminating races in RCTCxxBridge.
Pull Request resolved: https://github.com/facebook/react-native/pull/45558
Test Plan: I believe there are existing Unit tests in place for verifying this fix.
Reviewed By: cipolleschi
Differential Revision: D60233758
Pulled By: dmytrorykun
fbshipit-source-id: 8aa124a0521ad43a5e17b42e0ce6d22ae6b4e667
Summary:
This adds `ccache` on the Android build to speedup the building process.
## Changelog:
[INTERNAL] - Adding ccache for Android builds
Pull Request resolved: https://github.com/facebook/react-native/pull/45662
Test Plan: CI
Reviewed By: cipolleschi
Differential Revision: D60229625
Pulled By: cortinico
fbshipit-source-id: bc7e416f4ed1b4932159feb672947669bfb498d7
Summary:
A previous commit (https://github.com/facebook/react-native/pull/45616) broke the ci in OSS.
It looks like that JSI is not working well in objective-c++ files when frameworks is enabled.
We need to look into it further but we need to have green CI
## Changelog:
[Internal] - Unblock CI
Reviewed By: blakef
Differential Revision: D60232011
fbshipit-source-id: b02ae163258786ce43cc11bc94420682661a6dd0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45634
This allows the Android runtime to pass additional options to Metro. Each app can
decide what to send based on the needs. The use case is to send
transform.xyz=somevalue to Metro.
Changelog: [Internal]
Reviewed By: javache
Differential Revision: D60155757
fbshipit-source-id: 006d5ff2e3f14634fb39d44b390f30da479b1faa
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45621
This allows the iOS runtime to pass additional options to Metro. Each app can
decide what to send based on the needs. The use case is to send
`transform.xyz=somevalue` to Metro.
Changelog: [Internal]
Reviewed By: cipolleschi
Differential Revision: D60143663
fbshipit-source-id: 3e35a01a0ee121096d3a5cf0547e8e0ebf77f8ce
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45624
Must have forgot to add this functionality in, since it was just using a Rect for the clear region. This uses the proper rounded path.
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60147035
fbshipit-source-id: 3eebb2c4a56e4dfc957213e54f3d2de2c966082b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45622
The rest of these props setters opts to use `needsInvalidateLayer`, not `_needsInvalidateLayer` the latter of which is a instance variable. This change no effect since we set `_needsInvalidateLayer` to the or of both below, but we should be consistent with the rest of the logic here.
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60144215
fbshipit-source-id: b4b863d964a688c1cb9f6fada626d390681d1542
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45620
This does not really depend on anything in the layer. It is just a prop on the layer itself, so we can just set it in place. This pattern already happens for things like transform: https://fburl.com/code/0bhsdlcy
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60142154
fbshipit-source-id: 52ee0e1e6eacf3bba005a727a5a4325a5cc6d338
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45613
We had a bug where box shadows were not getting cleaned up. The fix here is easy - just call `[_boxShadowLayer removeFromSuperView]`. Previously we were just setting this layer to nil, which does not do the job.
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60137528
fbshipit-source-id: 310df944f63ffc73ee5fe938cfb5a48674f997ab
Summary:
## Context
During TW Bloks testing, I frequently encounter the issue of a page not loading. After investigating further, I discovered that for one XOCReactNativeHost, there are multiple instances of ReactInstanceManager created. One of them is properly initialized with XOCLoginActivity, while the other one is not initialized and its activity is null.
When calling ReactContext onHostResume, there is a small chance that the ReactInstanceManager with a null activity will be used, resulting in a "no activity" issue.
After analyzing the construction call stack of ReactInstanceManager, it appears that there is a race condition in the function of ReactNativeHost.getReactInstanceManager https://fburl.com/code/kh6o84m9.
I noticed that two threads are calling this function simultaneously, which can lead to the creation of two instances despite the `mReactInstanceManager == null check`, as it is not within a synchronized statement.
An example of one ReactNativeHost with multiple ReactInstanceManagers can be found at https://fburl.com/code/kh6o84m9.
{F1768111631}
The following are the call stack to create the ReactInstanceManagers, the line number may have slightly shift from the prod code because of debugging info.
P1490866855
P1490869412
## About this diff
Added synchronized lock to the checking of `mReactInstanceManager == null` and make mReactInstanceManager as volatile to avoid creating duplicated instance.
## Changelog:
[Android] [Fixed] - Made several methods in ReactNativeHost.java thread-safe to avoid race conditions
bypass-github-export-checks
Reviewed By: javache
Differential Revision: D60088120
fbshipit-source-id: a4c1970bb54c7395dbfc3282d02bd66d9dc95df9
Summary:
This just fixes a warning in scripts/releases-ci/__tests__/publish-updated-packages-test.js that the CI is firing on every PR
## Changelog:
[INTERNAL] - Fix warning on scripts/releases-ci/__tests__/publish-updated-packages-test.js
Pull Request resolved: https://github.com/facebook/react-native/pull/45643
Test Plan: CI
Reviewed By: blakef
Differential Revision: D60170227
Pulled By: cortinico
fbshipit-source-id: 5889f7dd530cc00651d683001e1f2624bd79c27e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45616
We want to eventually route all js error handling through JsErrorHandler in bridgeless.
This will help with that.
Changelog: [Internal]
Reviewed By: rubennorte
Differential Revision: D60138415
fbshipit-source-id: de62edfe75066ba135225e24543628306aa5f4a0
Summary:
When trying to use the legacy view interop with `stripe/stripe-react-native` there is an issue with the `CardField` component because it tries to access module registry inside the `view` method (https://github.com/stripe/stripe-react-native/blob/master/ios/CardFieldManager.swift#L7).
The problem is that we attach the legacy view apis after creating view, so they are not available in that method.
To fix this we can change the order of the methods and attach the apis first. Note that we also need to use the `manager` method instead of `bridgelessViewManager` since `bridgelessViewManager` is not initialized otherwise, it is initialized lazily in the `manager` method.
## Changelog:
[IOS] [FIXED] - Fix legacy view interop apis not available in view method
Pull Request resolved: https://github.com/facebook/react-native/pull/45609
Test Plan: Tested in an app that legacy interop apis (`moduleRegistry`) is available in the `view` method in an app using RN 0.74 with bridgeless mode enabled.
Reviewed By: cipolleschi
Differential Revision: D60165191
Pulled By: dmytrorykun
fbshipit-source-id: 60187556fb36d342bb1ef084a093132bdb0496bd
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45593
I'm guessing either there is a race condition between Github removing cache entries when we're over budget OR there is an eventual consistency issue between reported cache entries and their removal. Either way, this job is best efforts. If a entry targetted for removal isn't there, great.
This change prevents the job from stopping if an entry no longer exists.
Changelog: [Internal]
Reviewed By: cortinico
Differential Revision: D60106847
fbshipit-source-id: 252bba7bb0bbb91d279f06a39301491332cd5ace
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45585
Changelog: [internal]
Just migrates the flag to the new system.
Reviewed By: sammy-SC
Differential Revision: D60050005
fbshipit-source-id: 4da39446ecdb6cd86ccf7ee75a0d489764c37be6