Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51472
Changelog: [internal]
This enables the integration of `IntersectionObserver` with the Event Loop by default.
Reviewed By: rshest, javache
Differential Revision: D74991641
fbshipit-source-id: 7f12d7d5413d12a6a7de53e9d6701195d48996dc
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51452
Changelog: [internal]
This implements a long planned refactor of `IntersectionObserver` to have a proper integration with the Event Loop, which unblocks `FragmentRef` in React Native.
The existing integration doesn't integrate with the Event Loop, so the intersection determination doesn't happen as a step in the event loop but in 2 different moments:
1. When you start observing a new target, we check if there are any pending transactions for that target, and otherwise determine the intersection immediately and queue the notifications.
2. Using mount hooks, when a transaction for a surfaceId is mounted, we check intersections for all the observers in that surface.
This has an important problem:
* If you attach a observer on a target before the target is attached to the tree (something that `FragmentRef` will start doing soon), we don't have a pending transaction so we determine intersections immediately. In that case, it's always "not visible" because it's not attached, and then we immediately trigger a transition when mounted in the same tick.
To fix this, we can implement a step in the Event Loop the same way that `IntersectionObserver` does on Web. We would still wait for pending transactions to be mounted to determine intersection timing (the same way we do now, but now checking at the end of the current Event Loop tick), but the dispatch of initial notifications for target that won't change is done at the end of the tick instead of synchronously.
It also refactors the list of active observers as a list of shared pointers to `IntersectionObserver` objects, instead of as list of `IntersectionObserver` objects directly. This is necessary to build the list of pending observers (with stable references) while making sure the ownership stays in the list of active observers.
Reviewed By: javache
Differential Revision: D74883214
fbshipit-source-id: 24accf1dba48d13b5773950a5cbf9ea38f4a1745
Summary:
This PR improves `RCTScreenSize` to handle horizontal orientations. This was causing a flicker whenever opening a Modal in horizontal orientation. Currently, `RCTScreenSize` is used to supply initial state for `ModalHostViewState`:
https://github.com/facebook/react-native/blob/f1697544cd720df21bd7dc8ca993d95a41321e3f/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewState.h#L31
This works great in portrait mode, but causes onLayout the be called twice in horizontal orientation (first with screen size and then with actual size..)
## Changelog:
[IOS] [FIXED] - make RCTScreenSize take horizontal orientation into account
Pull Request resolved: https://github.com/facebook/react-native/pull/51444
Test Plan: Open modal in horizontal orientation
Reviewed By: cipolleschi
Differential Revision: D74978651
Pulled By: rshest
fbshipit-source-id: f026e727b3529766de38dd31059c51b255f33e78
Summary:
Hermes build-type was hardcoded to 'release' in the previous version of the prebuild scripts.
This commit fixes this so that we can provide a build-type for hermes when downloading prebuilt tarballs.
- Cleaned up parameters in hermes.js
- Updated with buildType parameter when suitable
- Fixed some function names
- Updated version file so that it contains build type
- Removed version file when using a local tarball
## Changelog:
[IOS] [FIXED] - Fixed resolving build type when downloading hermes artifacts
Pull Request resolved: https://github.com/facebook/react-native/pull/51283
Test Plan: No test-plan yet
Reviewed By: cortinico
Differential Revision: D74882001
Pulled By: cipolleschi
fbshipit-source-id: cfeed934023712e70f7d04c137e8611164120cec
Summary:
Our Cocoapods config has a list of defines that are used mostly when setting up pods:
- RCT_FABRIC_ENABLED
- USE_HERMES
- RCT_AGGREGATE_PRIVACY_FILES
- RCT_NEW_ARCH_ENABLED
- APP_PATH
- REACT_NATIVE_PATH
- RCT_SKIP_CODEGEN
- SWIFT_ACTIVE_COMPILATION_CONDITIONS
- USE_FRAMEWORKS
- USE_THIRD_PARTY_JSC
- HERMES_ENABLE_DEBUGGER
- REACT_NATIVE_DEBUGGER_ENABLED
- REACT_NATIVE_DEBUGGER_ENABLED_DEVONLY
Out of these, only the following are used in objective-c/c code:
- USE_HERMES
- HERMES_ENABLE_DEBUGGER
- REACT_NATIVE_DEBUGGER_ENABLED
- REACT_NATIVE_DEBUGGER_ENABLED_DEVONLY
This commit adds the required defines to the correct targets.
## Changelog:
Pick one each for the category and type tags:
[IOS] [FIXED] - fixed defines in package.swift
Pull Request resolved: https://github.com/facebook/react-native/pull/51284
Test Plan: No test-plan yet
Reviewed By: cortinico
Differential Revision: D74872272
Pulled By: cipolleschi
fbshipit-source-id: 5d9a68c1d819409bc7400ade622f62bb332d0896
Summary:
When running the prebuild script:
`node scripts/ios-prebuild.js`
The script will now try to resolve and download a prebuilt version of hermes:
1. Hermes artifacts will be extracted to the `./build/artifacts/hermes` folder to ensure that Package.swift can find a version to link against.
2. The script checks the environment variable `HERMES_ENGINE_TARBALL_PATH` and tries do expand the tarball into the artifacts folder from 1
3. If not found, the script reads the hermes version from either the hidden environment-variable `HERMES_VERSION` and tries to download a release-tarball or a nightly tarball for this version. If the version does not exist, the script will fail.
Also added some extra logging features to the script.
bypass-github-export-checks
## Changelog:
[IOS] [ADDED] - Added downloading of hermes artifacts when pre-building for iOS.
Pull Request resolved: https://github.com/facebook/react-native/pull/51216
Test Plan:
1. Delete the `packages/react-native/.build` folder
2. Run the build script (provide a valid HERMES_ENGINE_TARBALL_PATH or a valid Hermes version (or nightly version)
3. Verify that the script successfully exits
4. Build the Package.swift in Xcode and verify that it finds and links the relevant Hermes files, verifying is done by the build succeeding.
Reviewed By: NickGerleman
Differential Revision: D74565936
Pulled By: cipolleschi
fbshipit-source-id: 5bd231999da24cfcce446150ac0fc1b5a4b6a4ae
Summary:
Found an issue with the legacy native module calls in old architecture (https://github.com/facebook/react-native/issues/51443) and got the idea of adding some simple e2e tests for the native modules so regressions like this can be captured moving forward.
This doesn't cover all methods, as not all of them are available for both Android and iOS, and also some of them are currently crashing, so it makes no sense to cover them all yet – but this can be used as a good starting point to increase coverage for essential APIs.
## Changelog:
[INTERNAL] - Legacy Native Module e2e test
Pull Request resolved: https://github.com/facebook/react-native/pull/51449
Test Plan:
```sh
cd packages/rn-tester && maestro test .maestro/legacy-native-module.yml -e APP_ID=com.facebook.react.uiapp
```
<img width="594" alt="image" src="https://github.com/user-attachments/assets/6237613d-f5dc-4d8a-9b12-0980177793eb" />
<img width="740" alt="image" src="https://github.com/user-attachments/assets/8bdef368-13ac-494c-a506-88fff01dc8d6" />
Reviewed By: cortinico
Differential Revision: D74978093
Pulled By: rshest
fbshipit-source-id: f9c7ba3ca5177eb3d3863d2b8252ac17f3d07aa0
Summary:
I noticed the link to networking in new app screen is wrong. So correcting it here
## Changelog:
[GENERAL][FIXED] - Fix Networking URL in New app screen
Pull Request resolved: https://github.com/facebook/react-native/pull/51396
Test Plan: Click on the link to open
Reviewed By: arushikesarwani94
Differential Revision: D74886240
Pulled By: cortinico
fbshipit-source-id: 19ccf63e64f0e40df4a0ab4082299c654926e35d
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51465
Prior to D63303709 AttributedString could not represent formatting on an empty string, and so some text content was forcefully added to empty strings during measurement.
This is problematic in combination with Facsimile, where we directly render the layout we used during measurement, since empty text now has a random "I" in it.
Android's TextLayoutManager already knows how to interpret `baseTextAttributes`, and the placeholder is not needed. Other platforms should be updated to do the same, but that may be non-trivial to validate everywhere.
This diff removes logic from ShadowNodes to always inset a placeholder, and instead shims it in platform TextLayoutManagers which have not yet been updated to use `BaseTextAttributes`. That way, we don't force placeholders during measurement, and different platforms can incrementally unjank their code.
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D74770916
fbshipit-source-id: 7cf19db1a9a5cf68137bbff81b14ce5288235b2b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51464
Add a module of shared examples, like `TextInputSharedExamples`, to avoid copy/paste between these.
Modifies the empty test example a bit and adds an E2E test.
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D74780847
fbshipit-source-id: 30c2830ef0b638680fe75b4bcf9f138f5c01e190
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51389
# Changelog: [Internal]
This is the pre-requisite for the diff on top, which migrates performance-related classes to start using `HighResTimeStamp`.
We should be throwing `SyntaxError` if the specified mark name is not buffered. Like Chromium does:
{F1978032319}
In this diff:
- `PerformanceEntryReporter::getMarkTime` is now public, ca be called by `NativePerformance` and returns `std::optional`.
- `NativePerformance` is responsible for validating that marks are present in the buffer, if their names are specified in `.measure()` call.
- Mark names take precedence over `startTime` and `endTime` values, so if they are specified and not available, then we will throw Error over `jsi` that will be catched on JavaScript side in `Performance.js`.
Reviewed By: rubennorte
Differential Revision: D74837812
fbshipit-source-id: ca2ba198c4c9e6e2d8d37f852affea667f1c174c
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51461
We are trying to minimize the amount of non-determinism in flushing Animated operation queues. Initially the `ReactNativeFeatureFlags.animatedShouldSignalBatch` handled non-determinism on the native side, eliminating the use of native mount hooks to trigger operation batch flushes in the native module. However, there is additional non-determinism introduced by JS, where the set of pending Animated operations may be flushed as a result of an effect.
This change eliminates the flushing of Animated operations in the `useEffect` for `createAnimatedPropsHook.js`.
## Changelog
[Internal]
Reviewed By: yungsters, zeyap
Differential Revision: D75003751
fbshipit-source-id: 73c7bb02355b5f634f4a800f46ca5f529cd15ebd
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51459
When using `animatedShouldSignalBatch` in combination with `animatedShouldUseSingleOp`, we were seeing an issue where the queue is not flushed deterministically. It would be flushed in an ad-hoc manner by `createAnimatedPropsHook.js`, but this was only if a mount happened to occur in the same frame.
Adding a deterministic queue flush mechanism to the logic handling `animatedShouldUseSingleOp` appears to resolve the issue.
## Changelog
[Internal]
Reviewed By: javache
Differential Revision: D75002657
fbshipit-source-id: 51f50af0f22becf152da15a720ba70dfc158cdbf
Summary:
I noticed a missing debugging text while working on https://github.com/facebook/react-native/issues/50496. It was a typo. I though I might as well send a PR.
## Changelog:
[Android] [Fixed] - Fixing a typo in InterpolationAnimatedNode for debug text.
<!-- 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
Pull Request resolved: https://github.com/facebook/react-native/pull/51460
Reviewed By: cortinico, shwanton
Differential Revision: D75005096
Pulled By: javache
fbshipit-source-id: 390452b2b0c6eabfa003b9c95719649c79444d3a
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51390
# Changelog: [Internal]
Ideally, these should not be optional, but these values are set at runtime.
Assertions added to validate that these values are set before reporting to `PerformanceEntryReporter`.
Reviewed By: rshest
Differential Revision: D74811439
fbshipit-source-id: 5e95931848263a58d977c07bac0eb18e53b91140
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51420
The checked and unchecked state of the accessibility state property has to be serialized as `{ "checked": true }` and `{"checked": false}`.
This diff updates the serialization of the `accessibilityState` prop for the prop diffing on the View component.
This fixes the e2e test selectors for radio buttons.
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D74910744
fbshipit-source-id: 212b78e29a007744ac9283c7ec9b96ce80fd5681
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51451
This diff adds the `fantom_hermes_variant` pragma which can be set to:
- `hermes` for the default Hermes runtime used by RN
- `static_hermes` for the stable version of Static Hermes
- `static_hermes_trunk` for the "trunk" version of Static Hermes
Each variant will set up the correct build options for the runner and the correct compiler to use for the bundle.
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D74959718
fbshipit-source-id: 5d30c8e15ab052eb5686f26632f08ab42b5e68c7
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51393
In D74738548 we copied RCTFollyConvert to Follyconvert and we moved it to a separate file.
The problem is that when we build react native, we now might have duplicated symbols, especially with prebuilds where the symbols are "flattened" together.
To fix this, we can have the old file point to the new file in order not to break our suers and have a single symbol anyway.
## Changelog:
[Internal] -
Reviewed By: sammy-SC
Differential Revision: D74883143
fbshipit-source-id: 98361307286cdc19c57b8f5c9f066aebea992896
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51441
Refactors `RNTesterPlatformTestEventRecorder` so that it does not use `useMemo` from an instance method.
Instead, this diff changes the module to export a hook by the same name, `useRecorderTestEventHandlers`.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74950333
fbshipit-source-id: 6cb222a6ec077abadbdc7008e822645aba3d07f6
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51439
Migrates the `BackHandler` mock to use ESM to mitigate the existing lint warning.
I'm actually not sure this is even used anywhere… and the unmocked `BackHandler` is already using ESM.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74949885
fbshipit-source-id: 7f37212db2125bb7afdbd342175e3beae6c7c14f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51438
The `ReactNativePrivateInterface` module needs to continue using `module.exports` in order to lazily import dependencies.
For now, we just suppress the `lint/no-commonjs-exports` lint rule.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74949839
fbshipit-source-id: 295853be7fb988b879b6fd0b15ef31dd6e47cf85
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51434
Migrates files to use ESM to mitigate the existing lint warning.
I am suppressing `RelativeImageStub` to preserve compatibility with the dynamic asset exports generated by Metro (i.e. not ESM with `default` exports).
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74943031
fbshipit-source-id: ac4b2afd96fe5446acb4452395d7cb42bb5a6c17
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51433
This `ErrorUtils` mock is dead code.
There is no `ErrorUtils` module in React Native. (Maybe there was once upon a time...)
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74942884
fbshipit-source-id: 893458c4bc6f9ed29452579ce81915a52e6cd649
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51426
Fixes a bunch of ESLint warnings across the codebase.
The only remaining warnings are from the `lint/no-commonjs-exports` rule.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74942686
fbshipit-source-id: 384de34c7297f7f7fcff1827c8b2e46714a5cda7
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51415
Adds the `format` annotation to all files that were missing them.
Also, adds `noformat` to generated files, and removed it from files that no longer need them.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74901034
fbshipit-source-id: 7e0b85ca8ee2de41278f3aa23cb03e9c266d9c28
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51413
Prefers using this as a destructured import instead of as a member expression of `React`.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74895841
fbshipit-source-id: c1d3af40134a3721c9a7b676ee1f2c4a18612e4d
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51409
Prefers using this as a destructured import instead of as a member expression of `React`.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74895837
fbshipit-source-id: b9d6082e4882d95f0d2aa1eed13b725edeb854cd
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51410
Prefers using this as a destructured import instead of as a member expression of `React`.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74895844
fbshipit-source-id: 67f334981a1effce051c89e3d4643232aa22b4e9
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51411
Prefers using this as a destructured import instead of as a member expression of `React`.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74895840
fbshipit-source-id: 0a3d78d2871c3334b6e1b570744962a4d0168a9e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51408
Prefers using this as a destructured import instead of as a member expression of `React`.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74895838
fbshipit-source-id: 2cc369e168a7ee10aa4374717f817636841c372c
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51412
Prefers using this as a destructured import instead of as a member expression of `React`.
Changelog:
[Internal]
Reviewed By: SamChou19815
Differential Revision: D74895839
fbshipit-source-id: 9ab9fc8bdee6d1764ad86fa2165da32cb266174e