react-native 0.86.0 → 0.86.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/Libraries/ActionSheetIOS/React-RCTActionSheet.podspec +1 -1
  2. package/Libraries/Animated/components/AnimatedScrollView.js +1 -1
  3. package/Libraries/AppDelegate/React-RCTAppDelegate.podspec +1 -1
  4. package/Libraries/Blob/React-RCTBlob.podspec +1 -1
  5. package/Libraries/Components/Button.js +2 -2
  6. package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +1 -1
  7. package/Libraries/Components/TextInput/TextInput.flow.js +1 -1
  8. package/Libraries/Components/Touchable/Touchable.d.ts +1 -1
  9. package/Libraries/Components/View/ViewAccessibility.d.ts +1 -1
  10. package/Libraries/Components/View/ViewAccessibility.js +1 -1
  11. package/Libraries/Core/ReactNativeVersion.js +1 -1
  12. package/Libraries/Core/Timers/JSTimers.js +1 -1
  13. package/Libraries/Core/setUpNavigator.js +1 -1
  14. package/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts +1 -1
  15. package/Libraries/FBLazyVector/FBLazyVector.podspec +1 -1
  16. package/Libraries/Image/ImageSource.d.ts +1 -1
  17. package/Libraries/Image/RCTImageLoader.mm +1 -1
  18. package/Libraries/Image/React-RCTImage.podspec +1 -1
  19. package/Libraries/Interaction/PanResponder.js +1 -1
  20. package/Libraries/LinkingIOS/React-RCTLinking.podspec +1 -1
  21. package/Libraries/NativeAnimation/React-RCTAnimation.podspec +1 -1
  22. package/Libraries/Network/React-RCTNetwork.podspec +1 -1
  23. package/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec +1 -1
  24. package/Libraries/Renderer/README.md +2 -2
  25. package/Libraries/Required/RCTRequired.podspec +1 -1
  26. package/Libraries/Settings/React-RCTSettings.podspec +1 -1
  27. package/Libraries/Text/React-RCTText.podspec +1 -1
  28. package/Libraries/TypeSafety/RCTTypeSafety.podspec +1 -1
  29. package/Libraries/Utilities/PolyfillFunctions.js +1 -1
  30. package/Libraries/Vibration/React-RCTVibration.podspec +1 -1
  31. package/README.md +6 -6
  32. package/React/Base/RCTVersion.m +1 -1
  33. package/React/CoreModules/React-CoreModules.podspec +1 -1
  34. package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +1 -1
  35. package/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +1 -1
  36. package/React/React-RCTFBReactNativeSpec.podspec +1 -1
  37. package/React/React-RCTFabric.podspec +1 -1
  38. package/React/Runtime/React-RCTRuntime.podspec +1 -1
  39. package/React/Views/ScrollView/RCTScrollView.m +1 -1
  40. package/React-Core.podspec +1 -1
  41. package/React.podspec +1 -1
  42. package/ReactAndroid/build.gradle.kts +1 -1
  43. package/ReactAndroid/gradle.properties +1 -1
  44. package/ReactAndroid/publish.gradle +5 -5
  45. package/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +5 -4
  46. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/CxxInspectorPackagerConnection.kt +1 -1
  47. package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +39 -11
  48. package/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.kt +2 -2
  49. package/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.kt +1 -1
  50. package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.kt +2 -2
  51. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  52. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactInstance.kt +1 -1
  53. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +1 -1
  54. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollViewManager.kt +1 -1
  55. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.kt +1 -1
  56. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +1 -1
  57. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +2 -2
  58. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +2 -2
  59. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextSelectionWatcher.kt +1 -1
  60. package/ReactApple/Libraries/RCTFoundation/RCTDeprecation/RCTDeprecation.podspec +1 -1
  61. package/ReactApple/RCTSwiftUI/RCTSwiftUI.podspec +1 -1
  62. package/ReactApple/RCTSwiftUIWrapper/RCTSwiftUIWrapper.podspec +1 -1
  63. package/ReactCommon/React-Fabric.podspec +1 -1
  64. package/ReactCommon/React-FabricComponents.podspec +1 -1
  65. package/ReactCommon/React-FabricImage.podspec +1 -1
  66. package/ReactCommon/React-Mapbuffer.podspec +1 -1
  67. package/ReactCommon/ReactCommon.podspec +1 -1
  68. package/ReactCommon/callinvoker/React-callinvoker.podspec +1 -1
  69. package/ReactCommon/cxxreact/React-cxxreact.podspec +1 -1
  70. package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
  71. package/ReactCommon/hermes/React-hermes.podspec +1 -1
  72. package/ReactCommon/hermes/executor/React-jsitracing.podspec +1 -1
  73. package/ReactCommon/jserrorhandler/React-jserrorhandler.podspec +1 -1
  74. package/ReactCommon/jsi/React-jsi.podspec +1 -1
  75. package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +1 -1
  76. package/ReactCommon/jsinspector-modern/React-jsinspector.podspec +1 -1
  77. package/ReactCommon/jsinspector-modern/cdp/React-jsinspectorcdp.podspec +1 -1
  78. package/ReactCommon/jsinspector-modern/network/React-jsinspectornetwork.podspec +1 -1
  79. package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +1 -1
  80. package/ReactCommon/jsitooling/React-jsitooling.podspec +1 -1
  81. package/ReactCommon/logger/React-logger.podspec +1 -1
  82. package/ReactCommon/oscompat/React-oscompat.podspec +1 -1
  83. package/ReactCommon/react/debug/React-debug.podspec +1 -1
  84. package/ReactCommon/react/debug/redbox/JscSafeUrl.h +1 -1
  85. package/ReactCommon/react/featureflags/React-featureflags.podspec +1 -1
  86. package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +1 -1
  87. package/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +1 -1
  88. package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm +1 -1
  89. package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +1 -1
  90. package/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec +1 -1
  91. package/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec +1 -1
  92. package/ReactCommon/react/nativemodule/featureflags/React-featureflagsnativemodule.podspec +1 -1
  93. package/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec +1 -1
  94. package/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec +1 -1
  95. package/ReactCommon/react/nativemodule/microtasks/React-microtasksnativemodule.podspec +1 -1
  96. package/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec +1 -1
  97. package/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec +1 -1
  98. package/ReactCommon/react/nativemodule/viewtransition/React-viewtransitionnativemodule.podspec +1 -1
  99. package/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec +1 -1
  100. package/ReactCommon/react/networking/React-networking.podspec +1 -1
  101. package/ReactCommon/react/performance/cdpmetrics/React-performancecdpmetrics.podspec +1 -1
  102. package/ReactCommon/react/performance/timeline/React-performancetimeline.podspec +1 -1
  103. package/ReactCommon/react/renderer/animated/internal/primitives.h +1 -1
  104. package/ReactCommon/react/renderer/consistency/React-rendererconsistency.podspec +1 -1
  105. package/ReactCommon/react/renderer/core/ShadowNode.cpp +27 -19
  106. package/ReactCommon/react/renderer/core/ShadowNodeFamily.h +2 -0
  107. package/ReactCommon/react/renderer/css/React-renderercss.podspec +1 -1
  108. package/ReactCommon/react/renderer/debug/React-rendererdebug.podspec +1 -1
  109. package/ReactCommon/react/renderer/graphics/React-graphics.podspec +1 -1
  110. package/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec +1 -1
  111. package/ReactCommon/react/renderer/mounting/internal/CullingContext.cpp +1 -1
  112. package/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec +1 -1
  113. package/ReactCommon/react/renderer/uimanager/UIManager.cpp +58 -53
  114. package/ReactCommon/react/renderer/uimanager/tests/FabricUIManagerTest.cpp +144 -3
  115. package/ReactCommon/react/runtime/React-RuntimeCore.podspec +1 -1
  116. package/ReactCommon/react/runtime/React-RuntimeHermes.podspec +1 -1
  117. package/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec +1 -1
  118. package/ReactCommon/react/timing/React-timing.podspec +1 -1
  119. package/ReactCommon/react/utils/React-utils.podspec +1 -1
  120. package/ReactCommon/reactperflogger/React-perflogger.podspec +1 -1
  121. package/ReactCommon/runtimeexecutor/React-runtimeexecutor.podspec +1 -1
  122. package/ReactCommon/yoga/Yoga.podspec +1 -1
  123. package/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp +2 -1
  124. package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp +11 -7
  125. package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h +1 -1
  126. package/package.json +12 -12
  127. package/scripts/cocoapods/spm.rb +1 -1
  128. package/scripts/cocoapods/utils.rb +2 -2
  129. package/scripts/codegen/templates/ReactAppDependencyProvider.podspec.template +1 -1
  130. package/scripts/codegen/templates/ReactCodegen.podspec.template +1 -1
  131. package/scripts/ios-configure-glog.sh +1 -1
  132. package/sdks/.hermesv1version +1 -1
  133. package/sdks/hermes-engine/hermes-engine.podspec +1 -1
  134. package/sdks/hermes-engine/version.properties +1 -1
  135. package/src/private/types/HostInstance.js +1 -1
  136. package/src/types/globals.d.ts +2 -2
  137. package/third-party-podspecs/RCT-Folly.podspec +1 -1
  138. package/third-party-podspecs/ReactNativeDependencies.podspec +1 -1
  139. package/third-party-podspecs/glog.podspec +1 -1
  140. package/types/public/ReactNativeTypes.d.ts +2 -2
  141. package/types_generated/Libraries/Animated/components/AnimatedScrollView.d.ts +2 -2
  142. package/types_generated/Libraries/Components/Button.d.ts +3 -3
  143. package/types_generated/Libraries/Components/TextInput/TextInput.flow.d.ts +2 -2
  144. package/types_generated/Libraries/Components/View/ViewAccessibility.d.ts +4 -4
  145. package/types_generated/Libraries/Interaction/PanResponder.d.ts +2 -2
  146. package/types_generated/src/private/types/HostInstance.d.ts +2 -2
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we're presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we're presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we're presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -11,6 +11,6 @@
11
11
  namespace facebook::react::animated {
12
12
  // Indicates that the animated node identifier is not defined.
13
13
  // It is safe to use 0 because JavaScript starts assigning identifiers from 1.
14
- // https://github.com/facebook/react-native/blob/main/packages/react-native/src/private/animated/NativeAnimatedHelper.js#L35
14
+ // https://github.com/react/react-native/blob/main/packages/react-native/src/private/animated/NativeAnimatedHelper.js#L35
15
15
  constexpr static Tag undefinedAnimatedNodeIdentifier = 0;
16
16
  } // namespace facebook::react::animated
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -137,27 +137,35 @@ std::shared_ptr<ShadowNode> ShadowNode::clone(
137
137
  const ShadowNodeFragment& fragment) const {
138
138
  const auto& family = *family_;
139
139
  const auto& componentDescriptor = family.componentDescriptor_;
140
- if (family.nativeProps_DEPRECATED != nullptr) {
141
- auto propsParserContext = PropsParserContext{family_->getSurfaceId(), {}};
142
- if (fragment.props == ShadowNodeFragment::propsPlaceholder()) {
143
- // Clone existing `props_` with `family.nativeProps_DEPRECATED` to apply
144
- // previously set props via `setNativeProps` API.
145
- auto props = componentDescriptor.cloneProps(
146
- propsParserContext, props_, RawProps(*family.nativeProps_DEPRECATED));
147
- auto clonedNode = componentDescriptor.cloneShadowNode(
148
- *this,
149
- {.props = props,
150
- .children = fragment.children,
151
- .state = fragment.state});
152
- return clonedNode;
153
- } else {
154
- // TODO: We might need to merge fragment.props with
155
- // `family.nativeProps_DEPRECATED`.
156
- return componentDescriptor.cloneShadowNode(*this, fragment);
140
+
141
+ std::optional<RawProps> propsOverride;
142
+ {
143
+ std::lock_guard<std::mutex> lock(family.nativePropsMutex);
144
+ if (family.nativeProps_DEPRECATED != nullptr) {
145
+ if (fragment.props == ShadowNodeFragment::propsPlaceholder()) {
146
+ propsOverride.emplace(*family.nativeProps_DEPRECATED);
147
+ } else {
148
+ // TODO: We might need to merge fragment.props with
149
+ // `family.nativeProps_DEPRECATED`.
150
+ }
157
151
  }
158
- } else {
159
- return componentDescriptor.cloneShadowNode(*this, fragment);
160
152
  }
153
+
154
+ if (propsOverride) {
155
+ // Clone existing `props_` with `family.nativeProps_DEPRECATED` to
156
+ // apply previously set props via `setNativeProps` API. The parsed
157
+ // result escapes the lock so the rest of the clone work runs
158
+ // unblocked.
159
+ auto propsParserContext = PropsParserContext{family_->getSurfaceId(), {}};
160
+ return componentDescriptor.cloneShadowNode(
161
+ *this,
162
+ {.props = componentDescriptor.cloneProps(
163
+ propsParserContext, props_, std::move(*propsOverride)),
164
+ .children = fragment.children,
165
+ .state = fragment.state});
166
+ }
167
+
168
+ return componentDescriptor.cloneShadowNode(*this, fragment);
161
169
  }
162
170
 
163
171
  std::shared_ptr<const ContextContainer> ShadowNode::getContextContainer()
@@ -8,6 +8,7 @@
8
8
  #pragma once
9
9
 
10
10
  #include <memory>
11
+ #include <mutex>
11
12
  #include <shared_mutex>
12
13
 
13
14
  #include <react/renderer/core/EventEmitter.h>
@@ -114,6 +115,7 @@ class ShadowNodeFamily final : public jsi::NativeState {
114
115
  * architecture and will be removed in the future.
115
116
  */
116
117
  mutable std::unique_ptr<folly::dynamic> nativeProps_DEPRECATED;
118
+ mutable std::mutex nativePropsMutex;
117
119
 
118
120
  /**
119
121
  * @return tag for the ShadowNodeFamily.
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -52,7 +52,7 @@ CullingContext CullingContext::adjustCullingContextIfNeeded(
52
52
  // In RTL, content offset is flipped horizontally.
53
53
  // We need to flip the culling context frame to match.
54
54
  // See:
55
- // https://github.com/facebook/react-native/blob/c2f39cfdd87c32b9a59efe8a788b8a03f02b0ea0/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm#L579
55
+ // https://github.com/react/react-native/blob/c2f39cfdd87c32b9a59efe8a788b8a03f02b0ea0/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm#L579
56
56
  auto stateData = scrollViewShadowNode->getStateData();
57
57
  cullingContext.frame.origin.x =
58
58
  stateData.contentBoundingRect.size.width -
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -118,49 +118,51 @@ std::shared_ptr<ShadowNode> UIManager::cloneNode(
118
118
 
119
119
  auto& componentDescriptor = shadowNode.getComponentDescriptor();
120
120
  auto& family = shadowNode.getFamily();
121
- auto props = ShadowNodeFragment::propsPlaceholder();
122
121
 
122
+ auto props = ShadowNodeFragment::propsPlaceholder();
123
123
  if (!rawProps.isEmpty()) {
124
- if (family.nativeProps_DEPRECATED != nullptr) {
125
- // 1. update the nativeProps_DEPRECATED props.
126
- //
127
- // In this step, we want the most recent value for the props
128
- // managed by setNativeProps.
129
- // Values in `rawProps` patch (take precedence over)
130
- // `nativeProps_DEPRECATED`. For example, if both
131
- // `nativeProps_DEPRECATED` and `rawProps` contain key 'A'.
132
- // Value from `rawProps` overrides what was previously in
133
- // `nativeProps_DEPRECATED`. Notice that the `nativeProps_DEPRECATED`
134
- // patch will not get more props from `rawProps`: if the key is not
135
- // present in `nativeProps_DEPRECATED`, it will not be added.
136
- //
137
- // The result of this operation is the new `nativeProps_DEPRECATED`.
138
- family.nativeProps_DEPRECATED =
139
- std::make_unique<folly::dynamic>(mergeDynamicProps(
140
- *family.nativeProps_DEPRECATED, // source
141
- (folly::dynamic)rawProps, // patch
142
- NullValueStrategy::Ignore));
143
-
144
- // 2. Compute the final set of props.
145
- //
146
- // This step takes the new props handled by `setNativeProps` and
147
- // merges them in the `rawProps` managed by React.
148
- // The new props handled by `nativeProps` now takes precedence
149
- // on the props handled by React, as we want to make sure that
150
- // all the props are applied to the component.
151
- // We use these finalProps as source of truth for the component.
152
- auto finalProps = mergeDynamicProps(
153
- (folly::dynamic)rawProps, // source
154
- *family.nativeProps_DEPRECATED, // patch
155
- NullValueStrategy::Override);
156
-
157
- // 3. Clone the props by using finalProps.
158
- props = componentDescriptor.cloneProps(
159
- propsParserContext, shadowNode.getProps(), RawProps(finalProps));
160
- } else {
161
- props = componentDescriptor.cloneProps(
162
- propsParserContext, shadowNode.getProps(), std::move(rawProps));
124
+ std::optional<folly::dynamic> finalProps;
125
+ {
126
+ std::lock_guard<std::mutex> lock(family.nativePropsMutex);
127
+ if (family.nativeProps_DEPRECATED != nullptr) {
128
+ // 1. update the nativeProps_DEPRECATED props.
129
+ //
130
+ // In this step, we want the most recent value for the props
131
+ // managed by setNativeProps.
132
+ // Values in `rawProps` patch (take precedence over)
133
+ // `nativeProps_DEPRECATED`. For example, if both
134
+ // `nativeProps_DEPRECATED` and `rawProps` contain key 'A'.
135
+ // Value from `rawProps` overrides what was previously in
136
+ // `nativeProps_DEPRECATED`. Notice that the `nativeProps_DEPRECATED`
137
+ // patch will not get more props from `rawProps`: if the key is not
138
+ // present in `nativeProps_DEPRECATED`, it will not be added.
139
+ //
140
+ // The result of this operation is the new `nativeProps_DEPRECATED`.
141
+ family.nativeProps_DEPRECATED =
142
+ std::make_unique<folly::dynamic>(mergeDynamicProps(
143
+ *family.nativeProps_DEPRECATED, // source
144
+ (folly::dynamic)rawProps, // patch
145
+ NullValueStrategy::Ignore));
146
+
147
+ // 2. Compute the final set of props.
148
+ //
149
+ // This step takes the new props handled by `setNativeProps` and
150
+ // merges them in the `rawProps` managed by React.
151
+ // The new props handled by `nativeProps` now takes precedence
152
+ // on the props handled by React, as we want to make sure that
153
+ // all the props are applied to the component.
154
+ // We use these finalProps as source of truth for the component.
155
+ finalProps = mergeDynamicProps(
156
+ (folly::dynamic)rawProps, // source
157
+ *family.nativeProps_DEPRECATED, // patch
158
+ NullValueStrategy::Override);
159
+ }
163
160
  }
161
+
162
+ props = componentDescriptor.cloneProps(
163
+ propsParserContext,
164
+ shadowNode.getProps(),
165
+ finalProps ? RawProps(std::move(*finalProps)) : std::move(rawProps));
164
166
  }
165
167
 
166
168
  auto clonedShadowNode = componentDescriptor.cloneShadowNode(
@@ -439,19 +441,22 @@ void UIManager::setNativeProps_DEPRECATED(
439
441
  const std::shared_ptr<const ShadowNode>& shadowNode,
440
442
  RawProps rawProps) const {
441
443
  auto& family = shadowNode->getFamily();
442
- if (family.nativeProps_DEPRECATED) {
443
- // Values in `rawProps` patch (take precedence over)
444
- // `nativeProps_DEPRECATED`. For example, if both `nativeProps_DEPRECATED`
445
- // and `rawProps` contain key 'A'. Value from `rawProps` overrides what
446
- // was previously in `nativeProps_DEPRECATED`.
447
- family.nativeProps_DEPRECATED =
448
- std::make_unique<folly::dynamic>(mergeDynamicProps(
449
- *family.nativeProps_DEPRECATED,
450
- (folly::dynamic)rawProps,
451
- NullValueStrategy::Override));
452
- } else {
453
- family.nativeProps_DEPRECATED =
454
- std::make_unique<folly::dynamic>((folly::dynamic)rawProps);
444
+ {
445
+ std::lock_guard<std::mutex> lock(family.nativePropsMutex);
446
+ if (family.nativeProps_DEPRECATED) {
447
+ // Values in `rawProps` patch (take precedence over)
448
+ // `nativeProps_DEPRECATED`. For example, if both
449
+ // `nativeProps_DEPRECATED` and `rawProps` contain key 'A'. Value from
450
+ // `rawProps` overrides what was previously in `nativeProps_DEPRECATED`.
451
+ family.nativeProps_DEPRECATED =
452
+ std::make_unique<folly::dynamic>(mergeDynamicProps(
453
+ *family.nativeProps_DEPRECATED,
454
+ (folly::dynamic)rawProps,
455
+ NullValueStrategy::Override));
456
+ } else {
457
+ family.nativeProps_DEPRECATED =
458
+ std::make_unique<folly::dynamic>((folly::dynamic)rawProps);
459
+ }
455
460
  }
456
461
 
457
462
  shadowTreeRegistry_.visit(
@@ -8,10 +8,151 @@
8
8
  #include <memory>
9
9
 
10
10
  #include <gtest/gtest.h>
11
+ #include <react/renderer/components/view/ViewShadowNode.h>
12
+ #include <react/renderer/core/ShadowNodeFragment.h>
13
+ #include <react/renderer/element/Element.h>
14
+ #include <react/renderer/element/testUtils.h>
11
15
  #include <react/renderer/uimanager/UIManager.h>
12
16
 
13
- using namespace facebook::react;
17
+ namespace facebook::react {
14
18
 
15
- TEST(UIManagerTest, testSomething) {
16
- // TODO
19
+ class FabricUIManagerTest : public ::testing::Test {
20
+ public:
21
+ FabricUIManagerTest() {
22
+ contextContainer_ = std::make_shared<ContextContainer>();
23
+
24
+ ComponentDescriptorProviderRegistry componentDescriptorProviderRegistry{};
25
+ auto componentDescriptorRegistry =
26
+ componentDescriptorProviderRegistry.createComponentDescriptorRegistry(
27
+ ComponentDescriptorParameters{
28
+ .eventDispatcher = EventDispatcher::Shared{},
29
+ .contextContainer = contextContainer_,
30
+ .flavor = nullptr});
31
+
32
+ componentDescriptorProviderRegistry.add(
33
+ concreteComponentDescriptorProvider<RootComponentDescriptor>());
34
+ componentDescriptorProviderRegistry.add(
35
+ concreteComponentDescriptorProvider<ViewComponentDescriptor>());
36
+
37
+ builder_ = std::make_unique<ComponentBuilder>(componentDescriptorRegistry);
38
+
39
+ RuntimeExecutor runtimeExecutor =
40
+ [](std::function<void(
41
+ facebook::jsi::Runtime & runtime)>&& /*callback*/) {};
42
+ uiManager_ =
43
+ std::make_unique<UIManager>(runtimeExecutor, contextContainer_);
44
+ uiManager_->setComponentDescriptorRegistry(componentDescriptorRegistry);
45
+
46
+ buildAndCommitTree();
47
+ }
48
+
49
+ void TearDown() override {
50
+ uiManager_->stopSurface(surfaceId_);
51
+ }
52
+
53
+ protected:
54
+ std::shared_ptr<RootShadowNode> buildTree() {
55
+ std::shared_ptr<RootShadowNode> rootNode;
56
+
57
+ // clang-format off
58
+ auto element =
59
+ Element<RootShadowNode>()
60
+ .tag(1)
61
+ .surfaceId(surfaceId_)
62
+ .reference(rootNode)
63
+ .props([] {
64
+ auto sharedProps = std::make_shared<RootProps>();
65
+ sharedProps->layoutConstraints = LayoutConstraints{
66
+ .minimumSize = {.width = 0, .height = 0},
67
+ .maximumSize = {.width = 500, .height = 500}};
68
+ return sharedProps;
69
+ })
70
+ .children({
71
+ Element<ViewShadowNode>()
72
+ .tag(viewTag_)
73
+ .surfaceId(surfaceId_)
74
+ .props([] {
75
+ auto sharedProps = std::make_shared<ViewShadowNodeProps>();
76
+ sharedProps->nativeId = "initial";
77
+ sharedProps->opacity = 1.0;
78
+ return sharedProps;
79
+ })
80
+ });
81
+ // clang-format on
82
+
83
+ builder_->build(element);
84
+ return rootNode;
85
+ }
86
+
87
+ void buildAndCommitTree() {
88
+ auto rootNode = buildTree();
89
+
90
+ auto shadowTree = std::make_unique<ShadowTree>(
91
+ surfaceId_,
92
+ LayoutConstraints{},
93
+ LayoutContext{},
94
+ *uiManager_,
95
+ *contextContainer_);
96
+
97
+ shadowTreePtr_ = shadowTree.get();
98
+
99
+ shadowTree->commit(
100
+ [&rootNode](const RootShadowNode& /*oldRootShadowNode*/) {
101
+ return std::static_pointer_cast<RootShadowNode>(rootNode);
102
+ },
103
+ {true});
104
+
105
+ uiManager_->startSurface(
106
+ std::move(shadowTree),
107
+ "test",
108
+ folly::dynamic::object,
109
+ DisplayMode::Visible);
110
+ }
111
+
112
+ std::shared_ptr<const ShadowNode> currentViewNode() const {
113
+ auto root = shadowTreePtr_->getCurrentRevision().rootShadowNode;
114
+ return root->getChildren().front();
115
+ }
116
+
117
+ const ViewProps& viewPropsInTree() const {
118
+ return static_cast<const ViewProps&>(*currentViewNode()->getProps());
119
+ }
120
+
121
+ SurfaceId surfaceId_{0};
122
+ Tag viewTag_{42};
123
+ std::shared_ptr<ContextContainer> contextContainer_;
124
+ std::unique_ptr<ComponentBuilder> builder_;
125
+ std::unique_ptr<UIManager> uiManager_;
126
+ ShadowTree* shadowTreePtr_{nullptr};
127
+ };
128
+
129
+ // Demonstrates the merge between props set by `setNativeProps_DEPRECATED`
130
+ // (the legacy native-side prop override path) and props supplied by a
131
+ // regular React re-render via `cloneNode`. The native override must
132
+ // survive a React render that does not touch the overridden key, and
133
+ // other React-supplied keys must still apply.
134
+ TEST_F(FabricUIManagerTest, SetNativePropsMergesWithReactRender) {
135
+ ASSERT_EQ(viewPropsInTree().nativeId, "initial");
136
+ ASSERT_FLOAT_EQ(viewPropsInTree().opacity, 1.0);
137
+
138
+ // Native override on `opacity` only. The committed tree picks up the new
139
+ // opacity and leaves the unrelated `nativeId` untouched.
140
+ uiManager_->setNativeProps_DEPRECATED(
141
+ currentViewNode(), RawProps(folly::dynamic::object("opacity", 0.5)));
142
+ EXPECT_EQ(viewPropsInTree().nativeId, "initial");
143
+ EXPECT_FLOAT_EQ(viewPropsInTree().opacity, 0.5);
144
+
145
+ // Simulate a React re-render that updates `nativeID` only. The native
146
+ // `opacity` override must survive (it is not present in rawProps and
147
+ // therefore not refreshed away by React), and the new `nativeID` must
148
+ // apply on top.
149
+ auto rerendered = uiManager_->cloneNode(
150
+ *currentViewNode(),
151
+ /*children=*/nullptr,
152
+ RawProps(folly::dynamic::object("nativeID", "from-react")));
153
+ auto& merged = static_cast<const ViewProps&>(*rerendered->getProps());
154
+ EXPECT_EQ(merged.nativeId, "from-react");
155
+ EXPECT_FLOAT_EQ(merged.opacity, 0.5);
17
156
  }
157
+
158
+ } // namespace facebook::react
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "../../..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "../../..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "../../../../..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -8,7 +8,7 @@ require "json"
8
8
  package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
9
9
  version = package['version']
10
10
 
11
- source = { :git => 'https://github.com/facebook/react-native.git' }
11
+ source = { :git => 'https://github.com/react/react-native.git' }
12
12
  if version == '1000.0.0'
13
13
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14
14
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
@@ -6,7 +6,7 @@
6
6
  package = JSON.parse(File.read(File.expand_path('../../package.json', __dir__)))
7
7
  version = package['version']
8
8
 
9
- source = { :git => ENV['INSTALL_YOGA_FROM_LOCATION'] || 'https://github.com/facebook/react-native.git' }
9
+ source = { :git => ENV['INSTALL_YOGA_FROM_LOCATION'] || 'https://github.com/react/react-native.git' }
10
10
  if version == '1000.0.0'
11
11
  # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
12
12
  source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")