react-native 0.86.0-rc.3 → 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.
- package/Libraries/ActionSheetIOS/React-RCTActionSheet.podspec +1 -1
- package/Libraries/Animated/components/AnimatedScrollView.js +1 -1
- package/Libraries/AppDelegate/React-RCTAppDelegate.podspec +1 -1
- package/Libraries/Blob/React-RCTBlob.podspec +1 -1
- package/Libraries/Components/Button.js +2 -2
- package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +1 -1
- package/Libraries/Components/TextInput/TextInput.flow.js +1 -1
- package/Libraries/Components/Touchable/Touchable.d.ts +1 -1
- package/Libraries/Components/View/ViewAccessibility.d.ts +1 -1
- package/Libraries/Components/View/ViewAccessibility.js +1 -1
- package/Libraries/Core/ReactNativeVersion.js +2 -2
- package/Libraries/Core/Timers/JSTimers.js +1 -1
- package/Libraries/Core/setUpNavigator.js +1 -1
- package/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts +1 -1
- package/Libraries/FBLazyVector/FBLazyVector.podspec +1 -1
- package/Libraries/Image/ImageSource.d.ts +1 -1
- package/Libraries/Image/RCTImageLoader.mm +1 -1
- package/Libraries/Image/React-RCTImage.podspec +1 -1
- package/Libraries/Interaction/PanResponder.js +1 -1
- package/Libraries/LinkingIOS/React-RCTLinking.podspec +1 -1
- package/Libraries/NativeAnimation/React-RCTAnimation.podspec +1 -1
- package/Libraries/Network/React-RCTNetwork.podspec +1 -1
- package/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec +1 -1
- package/Libraries/Renderer/README.md +2 -2
- package/Libraries/Required/RCTRequired.podspec +1 -1
- package/Libraries/Settings/React-RCTSettings.podspec +1 -1
- package/Libraries/Text/React-RCTText.podspec +1 -1
- package/Libraries/TypeSafety/RCTTypeSafety.podspec +1 -1
- package/Libraries/Utilities/PolyfillFunctions.js +1 -1
- package/Libraries/Vibration/React-RCTVibration.podspec +1 -1
- package/README.md +6 -6
- package/React/Base/RCTVersion.m +2 -2
- package/React/CoreModules/React-CoreModules.podspec +1 -1
- package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +1 -1
- package/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +1 -1
- package/React/React-RCTFBReactNativeSpec.podspec +1 -1
- package/React/React-RCTFabric.podspec +1 -1
- package/React/Runtime/React-RCTRuntime.podspec +1 -1
- package/React/Views/ScrollView/RCTScrollView.m +1 -1
- package/React-Core.podspec +1 -1
- package/React.podspec +1 -1
- package/ReactAndroid/build.gradle.kts +1 -1
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/publish.gradle +5 -5
- package/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +5 -4
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/CxxInspectorPackagerConnection.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +39 -11
- package/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactInstance.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollViewManager.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextSelectionWatcher.kt +1 -1
- package/ReactApple/Libraries/RCTFoundation/RCTDeprecation/RCTDeprecation.podspec +1 -1
- package/ReactApple/RCTSwiftUI/RCTSwiftUI.podspec +1 -1
- package/ReactApple/RCTSwiftUIWrapper/RCTSwiftUIWrapper.podspec +1 -1
- package/ReactCommon/React-Fabric.podspec +1 -1
- package/ReactCommon/React-FabricComponents.podspec +1 -1
- package/ReactCommon/React-FabricImage.podspec +1 -1
- package/ReactCommon/React-Mapbuffer.podspec +1 -1
- package/ReactCommon/ReactCommon.podspec +1 -1
- package/ReactCommon/callinvoker/React-callinvoker.podspec +1 -1
- package/ReactCommon/cxxreact/React-cxxreact.podspec +1 -1
- package/ReactCommon/cxxreact/ReactNativeVersion.h +3 -3
- package/ReactCommon/hermes/React-hermes.podspec +1 -1
- package/ReactCommon/hermes/executor/React-jsitracing.podspec +1 -1
- package/ReactCommon/jserrorhandler/React-jserrorhandler.podspec +1 -1
- package/ReactCommon/jsi/React-jsi.podspec +1 -1
- package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +1 -1
- package/ReactCommon/jsinspector-modern/React-jsinspector.podspec +1 -1
- package/ReactCommon/jsinspector-modern/cdp/React-jsinspectorcdp.podspec +1 -1
- package/ReactCommon/jsinspector-modern/network/React-jsinspectornetwork.podspec +1 -1
- package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +1 -1
- package/ReactCommon/jsitooling/React-jsitooling.podspec +1 -1
- package/ReactCommon/logger/React-logger.podspec +1 -1
- package/ReactCommon/oscompat/React-oscompat.podspec +1 -1
- package/ReactCommon/react/debug/React-debug.podspec +1 -1
- package/ReactCommon/react/debug/redbox/JscSafeUrl.h +1 -1
- package/ReactCommon/react/featureflags/React-featureflags.podspec +1 -1
- package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +1 -1
- package/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/featureflags/React-featureflagsnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/microtasks/React-microtasksnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec +1 -1
- package/ReactCommon/react/nativemodule/viewtransition/React-viewtransitionnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec +1 -1
- package/ReactCommon/react/networking/React-networking.podspec +1 -1
- package/ReactCommon/react/performance/cdpmetrics/React-performancecdpmetrics.podspec +1 -1
- package/ReactCommon/react/performance/timeline/React-performancetimeline.podspec +1 -1
- package/ReactCommon/react/renderer/animated/internal/primitives.h +1 -1
- package/ReactCommon/react/renderer/consistency/React-rendererconsistency.podspec +1 -1
- package/ReactCommon/react/renderer/core/ShadowNode.cpp +27 -19
- package/ReactCommon/react/renderer/core/ShadowNodeFamily.h +2 -0
- package/ReactCommon/react/renderer/css/React-renderercss.podspec +1 -1
- package/ReactCommon/react/renderer/debug/React-rendererdebug.podspec +1 -1
- package/ReactCommon/react/renderer/graphics/React-graphics.podspec +1 -1
- package/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec +1 -1
- package/ReactCommon/react/renderer/mounting/internal/CullingContext.cpp +1 -1
- package/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec +1 -1
- package/ReactCommon/react/renderer/uimanager/UIManager.cpp +58 -53
- package/ReactCommon/react/renderer/uimanager/tests/FabricUIManagerTest.cpp +144 -3
- package/ReactCommon/react/runtime/React-RuntimeCore.podspec +1 -1
- package/ReactCommon/react/runtime/React-RuntimeHermes.podspec +1 -1
- package/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec +1 -1
- package/ReactCommon/react/timing/React-timing.podspec +1 -1
- package/ReactCommon/react/utils/React-utils.podspec +1 -1
- package/ReactCommon/reactperflogger/React-perflogger.podspec +1 -1
- package/ReactCommon/runtimeexecutor/React-runtimeexecutor.podspec +1 -1
- package/ReactCommon/yoga/Yoga.podspec +1 -1
- package/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp +2 -1
- package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp +11 -7
- package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h +1 -1
- package/package.json +12 -12
- package/scripts/cocoapods/spm.rb +1 -1
- package/scripts/cocoapods/utils.rb +2 -2
- package/scripts/codegen/templates/ReactAppDependencyProvider.podspec.template +1 -1
- package/scripts/codegen/templates/ReactCodegen.podspec.template +1 -1
- package/scripts/ios-configure-glog.sh +1 -1
- package/sdks/.hermesv1version +1 -1
- package/sdks/hermes-engine/hermes-engine.podspec +1 -1
- package/sdks/hermes-engine/version.properties +1 -1
- package/src/private/types/HostInstance.js +1 -1
- package/src/types/globals.d.ts +2 -2
- package/third-party-podspecs/RCT-Folly.podspec +1 -1
- package/third-party-podspecs/ReactNativeDependencies.podspec +1 -1
- package/third-party-podspecs/glog.podspec +1 -1
- package/types/public/ReactNativeTypes.d.ts +2 -2
- package/types_generated/Libraries/Animated/components/AnimatedScrollView.d.ts +2 -2
- package/types_generated/Libraries/Components/Button.d.ts +3 -3
- package/types_generated/Libraries/Components/TextInput/TextInput.flow.d.ts +2 -2
- package/types_generated/Libraries/Components/View/ViewAccessibility.d.ts +4 -4
- package/types_generated/Libraries/Interaction/PanResponder.d.ts +2 -2
- 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/
|
|
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/
|
|
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")
|
package/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec
CHANGED
|
@@ -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/
|
|
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/
|
|
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")
|
package/ReactCommon/react/nativemodule/viewtransition/React-viewtransitionnativemodule.podspec
CHANGED
|
@@ -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/
|
|
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")
|
package/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec
CHANGED
|
@@ -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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
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
|
-
|
|
17
|
+
namespace facebook::react {
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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")
|