react-native-windows 0.76.3 → 0.77.0-preview.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/.flowconfig +5 -1
- package/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts +1 -0
- package/Libraries/ActionSheetIOS/ActionSheetIOS.js +13 -0
- package/Libraries/Animated/AnimatedEvent.js +1 -1
- package/Libraries/Animated/AnimatedImplementation.js +2 -2
- package/Libraries/Animated/NativeAnimatedAllowlist.js +20 -9
- package/Libraries/Animated/animations/Animation.js +60 -25
- package/Libraries/Animated/animations/DecayAnimation.js +26 -38
- package/Libraries/Animated/animations/SpringAnimation.js +33 -39
- package/Libraries/Animated/animations/TimingAnimation.js +34 -42
- package/Libraries/Animated/components/AnimatedFlatList.js +1 -1
- package/Libraries/Animated/components/AnimatedSectionList.js +3 -1
- package/Libraries/Animated/createAnimatedComponent.js +60 -33
- package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
- package/Libraries/Animated/nodes/AnimatedInterpolation.js +1 -1
- package/Libraries/Animated/nodes/AnimatedNode.js +39 -45
- package/Libraries/Animated/nodes/AnimatedObject.js +13 -3
- package/Libraries/Animated/nodes/AnimatedProps.js +104 -46
- package/Libraries/Animated/nodes/AnimatedStyle.js +116 -39
- package/Libraries/Animated/nodes/AnimatedTransform.js +56 -23
- package/Libraries/Animated/nodes/AnimatedValue.js +1 -1
- package/Libraries/Animated/nodes/AnimatedWithChildren.js +1 -3
- package/Libraries/Animated/useAnimatedProps.js +41 -35
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +77 -5
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.windows.js +82 -5
- package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +4 -4
- package/Libraries/Components/Button.js +9 -4
- package/Libraries/Components/Button.windows.js +19 -5
- package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.js +3 -1
- package/Libraries/Components/Glyph/Glyph.js +2 -1
- package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +7 -0
- package/Libraries/Components/Popup/PopupNativeComponent.js +0 -1
- package/Libraries/Components/Pressable/Pressable.js +4 -4
- package/Libraries/Components/Pressable/Pressable.windows.js +10 -4
- package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.android.js +13 -7
- package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +3 -2
- package/Libraries/Components/SafeAreaView/SafeAreaView.js +4 -4
- package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +0 -1
- package/Libraries/Components/ScrollView/ScrollView.js +49 -88
- package/Libraries/Components/ScrollView/ScrollViewCommands.js +1 -1
- package/Libraries/Components/ScrollView/ScrollViewContext.js +2 -0
- package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +0 -2
- package/Libraries/Components/ScrollView/ScrollViewNativeComponent.windows.js +0 -5
- package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +8 -9
- package/Libraries/Components/Switch/Switch.js +8 -6
- package/Libraries/Components/Switch/Switch.windows.js +8 -6
- package/Libraries/Components/TextInput/InputAccessoryView.js +1 -1
- package/Libraries/Components/TextInput/RCTMultilineTextInputNativeComponent.js +4 -4
- package/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js +6 -4
- package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +2 -1
- package/Libraries/Components/TextInput/TextInput.d.ts +27 -4
- package/Libraries/Components/TextInput/TextInput.flow.js +36 -19
- package/Libraries/Components/TextInput/TextInput.js +37 -13
- package/Libraries/Components/TextInput/TextInput.windows.js +47 -16
- package/Libraries/Components/TextInput/TextInputState.js +11 -13
- package/Libraries/Components/TextInput/TextInputState.windows.js +11 -13
- package/Libraries/Components/Touchable/BoundingDimensions.js +11 -3
- package/Libraries/Components/Touchable/Position.js +7 -2
- package/Libraries/Components/Touchable/Touchable.js +4 -0
- package/Libraries/Components/Touchable/Touchable.windows.js +4 -0
- package/Libraries/Components/Touchable/TouchableBounce.js +6 -2
- package/Libraries/Components/Touchable/TouchableBounce.windows.js +227 -0
- package/Libraries/Components/Touchable/TouchableHighlight.js +5 -5
- package/Libraries/Components/Touchable/TouchableHighlight.windows.js +5 -5
- package/Libraries/Components/Touchable/TouchableNativeFeedback.windows.js +371 -0
- package/Libraries/Components/Touchable/TouchableOpacity.js +6 -5
- package/Libraries/Components/Touchable/TouchableOpacity.windows.js +11 -5
- package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -2
- package/Libraries/Components/Touchable/TouchableWithoutFeedback.windows.js +9 -3
- package/Libraries/Components/View/ReactNativeStyleAttributes.js +6 -1
- package/Libraries/Components/View/View.js +4 -4
- package/Libraries/Components/View/View.windows.js +12 -5
- package/Libraries/Components/View/ViewAccessibility.d.ts +10 -0
- package/Libraries/Components/View/ViewAccessibility.windows.js +2 -0
- package/Libraries/Components/View/ViewNativeComponent.js +6 -98
- package/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
- package/Libraries/Components/View/ViewPropTypes.js +0 -3
- package/Libraries/Components/View/ViewPropTypes.windows.js +2 -3
- package/Libraries/Core/ExceptionsManager.js +50 -29
- package/Libraries/Core/ReactNativeVersion.js +3 -3
- package/Libraries/Core/__mocks__/NativeExceptionsManager.js +0 -1
- package/Libraries/Core/setUpBatchedBridge.js +1 -10
- package/Libraries/Core/setUpDeveloperTools.js +1 -5
- package/Libraries/Core/setUpErrorHandling.js +20 -18
- package/Libraries/Core/setUpReactDevTools.js +107 -8
- package/Libraries/Core/setUpSegmentFetcher.js +1 -0
- package/Libraries/Core/setUpTimers.js +21 -18
- package/Libraries/Debugging/DebuggingOverlay.js +4 -5
- package/Libraries/Image/AssetSourceResolver.js +12 -1
- package/Libraries/Image/AssetSourceResolver.windows.js +12 -1
- package/Libraries/Image/Image.android.js +1 -5
- package/Libraries/Image/Image.d.ts +20 -29
- package/Libraries/Image/Image.ios.js +0 -2
- package/Libraries/Image/Image.windows.js +5 -1
- package/Libraries/Image/ImageBackground.js +2 -5
- package/Libraries/Image/ImageProps.js +7 -6
- package/Libraries/Image/ImageResizeMode.d.ts +8 -1
- package/Libraries/Image/ImageResizeMode.js +4 -1
- package/Libraries/Image/ImageSource.d.ts +0 -2
- package/Libraries/Image/ImageSource.js +0 -2
- package/Libraries/Image/ImageTypes.flow.js +11 -9
- package/Libraries/Image/ImageUtils.js +6 -3
- package/Libraries/Image/ImageViewNativeComponent.js +5 -3
- package/Libraries/Inspector/Inspector.js +1 -0
- package/Libraries/Inspector/NetworkOverlay.js +4 -0
- package/Libraries/Inspector/ReactDevToolsOverlay.js +8 -14
- package/Libraries/Inspector/getInspectorDataForViewAtPoint.js +3 -5
- package/Libraries/Interaction/InteractionManager.js +6 -1
- package/Libraries/Interaction/InteractionManagerStub.js +176 -0
- package/Libraries/Interaction/TouchHistoryMath.js +22 -19
- package/Libraries/JSInspector/NetworkAgent.js +1 -1
- package/Libraries/Lists/FlatList.d.ts +1 -2
- package/Libraries/Lists/FlatList.js +2 -2
- package/Libraries/Lists/SectionListModern.js +7 -7
- package/Libraries/Lists/__flowtests__/FlatList-flowtest.js +2 -2
- package/Libraries/Lists/__flowtests__/SectionList-flowtest.js +1 -1
- package/Libraries/LogBox/Data/LogBoxData.js +3 -3
- package/Libraries/LogBox/LogBox.js +18 -5
- package/Libraries/LogBox/LogBoxInspectorContainer.js +1 -1
- package/Libraries/LogBox/LogBoxNotificationContainer.js +2 -2
- package/Libraries/LogBox/UI/AnsiHighlight.js +26 -17
- package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.js +6 -1
- package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.windows.js +6 -1
- package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
- package/Libraries/LogBox/UI/LogBoxInspectorHeader.windows.js +1 -1
- package/Libraries/LogBox/UI/LogBoxInspectorStackFrames.js +1 -1
- package/Libraries/LogBox/UI/LogBoxMessage.js +2 -2
- package/Libraries/Modal/Modal.d.ts +12 -0
- package/Libraries/Modal/Modal.js +31 -4
- package/Libraries/Modal/Modal.windows.js +18 -0
- package/Libraries/NativeComponent/BaseViewConfig.android.js +72 -1
- package/Libraries/NativeComponent/BaseViewConfig.ios.js +2 -1
- package/Libraries/NativeComponent/BaseViewConfig.windows.js +3 -11
- package/Libraries/NativeComponent/NativeComponentRegistry.js +3 -3
- package/Libraries/NativeComponent/StaticViewConfigValidator.js +0 -1
- package/Libraries/Network/FormData.js +11 -3
- package/Libraries/Network/XHRInterceptor.js +63 -14
- package/Libraries/Network/XMLHttpRequest.js +26 -1
- package/Libraries/NewAppScreen/components/HermesBadge.js +1 -1
- package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +49 -2
- package/Libraries/PermissionsAndroid/PermissionsAndroid.js +4 -4
- package/Libraries/Pressability/HoverState.js +2 -0
- package/Libraries/Pressability/Pressability.js +2 -3
- package/Libraries/Pressability/Pressability.windows.js +2 -3
- package/Libraries/Pressability/usePressability.js +4 -1
- package/Libraries/ReactNative/AppContainer.js +1 -1
- package/Libraries/ReactNative/AppRegistry.js +1 -11
- package/Libraries/ReactNative/DisplayMode.js +1 -1
- package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +2 -3
- package/Libraries/ReactNative/RendererImplementation.js +18 -17
- package/Libraries/ReactNative/getCachedComponentWithDebugName.js +1 -3
- package/Libraries/ReactNative/renderApplication.js +9 -8
- package/Libraries/ReactNative/requireNativeComponent.js +5 -2
- package/Libraries/Renderer/shims/ReactFabric.js +3 -3
- package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -2
- package/Libraries/Renderer/shims/ReactNative.js +3 -3
- package/Libraries/Renderer/shims/ReactNativeTypes.js +22 -35
- package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +5 -6
- package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
- package/Libraries/StyleSheet/StyleSheet.js +7 -1
- package/Libraries/StyleSheet/StyleSheetTypes.d.ts +13 -2
- package/Libraries/StyleSheet/StyleSheetTypes.js +24 -6
- package/Libraries/StyleSheet/processBackgroundImage.js +87 -110
- package/Libraries/StyleSheet/processTransform.js +3 -34
- package/Libraries/Text/Text.js +248 -249
- package/Libraries/Text/Text.windows.js +298 -292
- package/Libraries/Text/TextNativeComponent.js +0 -1
- package/Libraries/Text/TextProps.windows.js +2 -0
- package/Libraries/TurboModule/TurboModuleRegistry.js +5 -5
- package/Libraries/Types/CoreEventTypes.d.ts +3 -10
- package/Libraries/Types/CoreEventTypes.js +4 -6
- package/Libraries/Types/CoreEventTypes.windows.js +4 -6
- package/Libraries/Utilities/Appearance.js +3 -1
- package/Libraries/Utilities/BackHandler.android.js +6 -18
- package/Libraries/Utilities/BackHandler.d.ts +0 -4
- package/Libraries/Utilities/BackHandler.ios.js +0 -7
- package/Libraries/Utilities/BackHandler.windows.js +6 -18
- package/Libraries/Utilities/HMRClient.js +3 -4
- package/Libraries/Utilities/Platform.flow.js +2 -2
- package/Libraries/Utilities/Platform.flow.windows.js +3 -2
- package/Libraries/Utilities/__mocks__/BackHandler.js +3 -8
- package/Libraries/Utilities/codegenNativeComponent.js +1 -1
- package/Libraries/Utilities/useMergeRefs.js +26 -7
- package/Libraries/WebSocket/WebSocketEvent.js +4 -1
- package/Libraries/WebSocket/WebSocketInterceptor.js +31 -13
- package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +6 -5
- package/Libraries/promiseRejectionTrackingOptions.js +1 -1
- package/Microsoft.ReactNative/AsynchronousEventBeat.cpp +9 -8
- package/Microsoft.ReactNative/AsynchronousEventBeat.h +5 -5
- package/Microsoft.ReactNative/FBReactNativeSpec/FBReactNativeSpecJSI.h +5 -0
- package/Microsoft.ReactNative/Fabric/AbiComponentDescriptor.cpp +2 -2
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +197 -18
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.h +19 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +13 -0
- package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentDescriptor.h +6 -8
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +2 -2
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.cpp +3 -2
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +24 -0
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +5 -0
- package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +12 -12
- package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.h +4 -4
- package/Microsoft.ReactNative/Fabric/ImageRequest.cpp +4 -8
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewProps.cpp +16 -15
- package/Microsoft.ReactNative/Modules/AccessibilityInfoModule.cpp +15 -0
- package/Microsoft.ReactNative/Modules/AccessibilityInfoModule.h +9 -0
- package/Microsoft.ReactNative/ReactHost/ReactHost.cpp +20 -1
- package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +11 -6
- package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.h +1 -1
- package/Microsoft.ReactNative/SynchronousEventBeat.cpp +14 -4
- package/Microsoft.ReactNative/SynchronousEventBeat.h +4 -2
- package/Microsoft.ReactNative.Cxx/ApiLoaders/JSRuntimeApi.cpp +78 -0
- package/Microsoft.ReactNative.Cxx/ApiLoaders/JSRuntimeApi.h +51 -0
- package/Microsoft.ReactNative.Cxx/ApiLoaders/JSRuntimeApi.inc +48 -0
- package/Microsoft.ReactNative.Cxx/ApiLoaders/NodeApi.cpp +41 -0
- package/Microsoft.ReactNative.Cxx/ApiLoaders/NodeApi.h +127 -0
- package/Microsoft.ReactNative.Cxx/ApiLoaders/NodeApi.inc +125 -0
- package/Microsoft.ReactNative.Cxx/ApiLoaders/NodeApi_posix.cpp +16 -0
- package/Microsoft.ReactNative.Cxx/ApiLoaders/NodeApi_win.cpp +23 -0
- package/Microsoft.ReactNative.Cxx/JSI/decorator.h +834 -0
- package/Microsoft.ReactNative.Cxx/JSI/instrumentation.h +117 -0
- package/Microsoft.ReactNative.Cxx/JSI/jsi-inl.h +366 -0
- package/Microsoft.ReactNative.Cxx/JSI/jsi.cpp +560 -0
- package/Microsoft.ReactNative.Cxx/JSI/jsi.h +1611 -0
- package/Microsoft.ReactNative.Cxx/JSI/threadsafe.h +79 -0
- package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +7 -11
- package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems.filters +1 -1
- package/Microsoft.ReactNative.Cxx/NodeApiJsiRuntime.cpp +2878 -0
- package/Microsoft.ReactNative.Cxx/NodeApiJsiRuntime.h +36 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/CallInvoker.h +64 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/SchedulerPriority.h +22 -0
- package/{ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core → Microsoft.ReactNative.Cxx}/ReactCommon/TurboModule.cpp +63 -63
- package/Microsoft.ReactNative.Cxx/ReactCommon/TurboModule.h +165 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/TurboModuleUtils.cpp +105 -0
- package/{ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core → Microsoft.ReactNative.Cxx}/ReactCommon/TurboModuleUtils.h +57 -58
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/AString.h +42 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Array.h +151 -0
- package/{ReactCommon/TEMP_UntilReactCommonUpdate → Microsoft.ReactNative.Cxx/ReactCommon}/react/bridging/Base.h +177 -154
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Bool.h +25 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Bridging.h +21 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/CallbackWrapper.h +67 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Class.h +90 -0
- package/{ReactCommon/TEMP_UntilReactCommonUpdate → Microsoft.ReactNative.Cxx/ReactCommon}/react/bridging/Convert.h +170 -172
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Error.h +51 -0
- package/{ReactCommon/TEMP_UntilReactCommonUpdate → Microsoft.ReactNative.Cxx/ReactCommon}/react/bridging/EventEmitter.h +134 -136
- package/{ReactCommon/TEMP_UntilReactCommonUpdate → Microsoft.ReactNative.Cxx/ReactCommon}/react/bridging/Function.h +283 -283
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/LongLivedObject.cpp +63 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/LongLivedObject.h +61 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Object.h +93 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Promise.h +104 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/bridging/Value.h +107 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/debug/flags.h +22 -0
- package/Microsoft.ReactNative.Cxx/ReactCommon/react/debug/react_native_assert.h +72 -0
- package/Microsoft.ReactNative.Cxx/node-api/js_native_api.h +553 -0
- package/Microsoft.ReactNative.Cxx/node-api/js_native_api_types.h +167 -0
- package/Microsoft.ReactNative.Cxx/node-api/js_runtime_api.h +186 -0
- package/Microsoft.ReactNative.Cxx/stubs/glog/logging.h +82 -0
- package/PropertySheets/Bundle.Common.targets +1 -1
- package/PropertySheets/Bundle.props +3 -0
- package/PropertySheets/Generated/PackageVersion.g.props +4 -4
- package/PropertySheets/ManagedCodeGen/Microsoft.ReactNative.Managed.CodeGen.targets +1 -1
- package/PropertySheets/OutputMSBuildProperties.targets +3 -1
- package/PropertySheets/React.Cpp.props +6 -0
- package/ReactCommon/ReactCommon.vcxproj +5 -0
- package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/JSExecutor.cpp +2 -3
- package/ReactCommon/TEMP_UntilReactCommonUpdate/jsi/jsi/test/testlib.cpp +61 -0
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModule.h +26 -23
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp +150 -0
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/AccessibilityPrimitives.h +252 -0
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/accessibilityPropsConversions.h +795 -0
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/runtimescheduler/SchedulerPriorityUtils.h +59 -0
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/ReactInstance.cpp +227 -74
- package/Scripts/Microsoft.ReactNative.Managed.CodeGen.targets +1 -1
- package/Scripts/Tfs/Layout-MSRN-Headers.ps1 +97 -62
- package/Shared/InspectorPackagerConnection.cpp +3 -6
- package/Shared/InspectorPackagerConnection.h +2 -2
- package/Shared/InstanceManager.h +1 -1
- package/Shared/OInstance.h +1 -1
- package/Shared/Shared.vcxitems +17 -2
- package/Shared/Shared.vcxitems.filters +3 -1
- package/Shared/TurboModuleManager.cpp +29 -4
- package/codegen/NativeAccessibilityInfoSpec.g.h +27 -9
- package/codegen/NativeAccessibilityManagerSpec.g.h +19 -13
- package/codegen/NativeActionSheetManagerSpec.g.h +4 -0
- package/codegen/NativeExceptionsManagerSpec.g.h +1 -7
- package/codegen/NativeIntersectionObserverSpec.g.h +2 -0
- package/codegen/NativePerformanceSpec.g.h +127 -3
- package/codegen/NativeReactDevToolsRuntimeSettingsModuleSpec.g.h +67 -0
- package/codegen/NativeReactDevToolsSettingsManagerSpec.g.h +41 -0
- package/codegen/NativeReactNativeFeatureFlagsSpec.g.h +125 -137
- package/codegen/react/components/rnwcore/ComponentDescriptors.h +0 -1
- package/codegen/react/components/rnwcore/Props.cpp +1 -0
- package/codegen/react/components/rnwcore/Props.h +1 -0
- package/codegen/react/components/rnwcore/ShadowNodes.cpp +0 -1
- package/codegen/react/components/rnwcore/ShadowNodes.h +0 -11
- package/codegen/react/components/rnwcore/States.h +0 -12
- package/codegen/rnwcoreJSI-generated.cpp +219 -186
- package/codegen/rnwcoreJSI.h +942 -511
- package/index.js +10 -3
- package/index.windows.js +10 -3
- package/jest/setup.js +36 -1
- package/just-task.js +15 -0
- package/package.json +22 -22
- package/src/private/animated/NativeAnimatedHelper.js +18 -16
- package/src/private/animated/useAnimatedPropsMemo.js +356 -0
- package/src/private/components/HScrollViewNativeComponents.js +1 -27
- package/src/private/components/SafeAreaView_INTERNAL_DO_NOT_USE.js +11 -8
- package/src/private/components/VScrollViewNativeComponents.js +2 -25
- package/src/private/debugging/ReactDevToolsSettingsManager.android.js +20 -0
- package/src/private/debugging/ReactDevToolsSettingsManager.ios.js +30 -0
- package/src/private/debugging/ReactDevToolsSettingsManager.windows.js +20 -0
- package/src/private/{fusebox → debugging}/setUpFuseboxReactDevToolsDispatcher.js +6 -0
- package/src/private/devmenu/DevMenu.d.ts +20 -0
- package/src/private/devmenu/DevMenu.js +31 -0
- package/src/private/featureflags/ReactNativeFeatureFlags.js +95 -86
- package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +8 -2
- package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +17 -19
- package/src/private/fusebox/specs/NativeReactDevToolsRuntimeSettingsModule.js +34 -0
- package/src/private/setup/setUpDOM.js +14 -6
- package/src/private/setup/setUpMutationObserver.js +5 -0
- package/src/private/specs/components/AndroidHorizontalScrollContentViewNativeComponent.js +1 -0
- package/src/private/specs/components/RCTModalHostViewNativeComponent.js +8 -0
- package/src/private/specs/modules/NativeAccessibilityInfo.js +9 -0
- package/src/private/specs/modules/NativeAccessibilityManager.js +4 -0
- package/src/private/specs/modules/NativeActionSheetManager.js +2 -0
- package/src/private/specs/modules/NativeAppearance.js +4 -10
- package/src/private/specs/modules/NativeExceptionsManager.js +0 -12
- package/src/private/specs/modules/{NativeDevToolsSettingsManager.js → NativeReactDevToolsSettingsManager.js} +3 -5
- package/src/private/webapis/dom/geometry/DOMRect.js +2 -2
- package/src/private/webapis/dom/geometry/DOMRectReadOnly.js +2 -2
- package/src/private/webapis/dom/nodes/ReactNativeElement.js +2 -3
- package/src/private/webapis/intersectionobserver/IntersectionObserver.js +102 -11
- package/src/private/webapis/intersectionobserver/IntersectionObserverEntry.js +26 -0
- package/src/private/webapis/intersectionobserver/IntersectionObserverManager.js +1 -0
- package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +1 -0
- package/src/private/webapis/intersectionobserver/specs/__mocks__/NativeIntersectionObserver.js +9 -0
- package/src/private/webapis/performance/EventTiming.js +13 -8
- package/src/private/webapis/performance/Performance.js +66 -73
- package/src/private/webapis/performance/PerformanceEntry.js +2 -5
- package/src/private/webapis/performance/PerformanceObserver.js +65 -164
- package/src/private/webapis/performance/RawPerformanceEntry.js +1 -1
- package/src/private/webapis/performance/UserTiming.js +11 -7
- package/src/private/webapis/performance/Utilities.js +18 -0
- package/src/private/webapis/performance/specs/NativePerformance.js +71 -2
- package/src/private/webapis/performance/specs/__mocks__/NativePerformanceMock.js +267 -0
- package/templates/cpp-lib/template.config.js +13 -7
- package/templates/templateUtils.js +10 -0
- package/types/index.d.ts +1 -1
- package/types/public/ReactNativeTypes.d.ts +4 -8
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.android.js +0 -35
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts +0 -20
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.ios.js +0 -49
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.windows.js +0 -35
- package/Libraries/DevToolsSettings/NativeDevToolsSettingsManager.js +0 -13
- package/Libraries/ReactNative/ReactFabricInternals.js +0 -17
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/CallbackWrapper.h +0 -101
- package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/scrollview/ScrollViewProps.cpp +0 -569
- package/codegen/NativeDevToolsSettingsManagerSpec.g.h +0 -53
- package/codegen/NativePerformanceObserverSpec.g.h +0 -131
- package/src/private/components/useSyncOnScroll.js +0 -48
- package/src/private/webapis/performance/specs/NativePerformanceObserver.js +0 -61
- package/src/private/webapis/performance/specs/__mocks__/NativePerformance.js +0 -67
- package/src/private/webapis/performance/specs/__mocks__/NativePerformanceObserver.js +0 -127
- package/types/experimental.d.ts +0 -59
- /package/src/private/{fusebox → debugging}/FuseboxSessionObserver.js +0 -0
|
@@ -1,283 +1,283 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the MIT license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
#pragma once
|
|
9
|
-
|
|
10
|
-
#include <Base.h>
|
|
11
|
-
#include <CallbackWrapper.h>
|
|
12
|
-
|
|
13
|
-
#include <ReactCommon/CallInvoker.h>
|
|
14
|
-
#include <ReactCommon/SchedulerPriority.h>
|
|
15
|
-
|
|
16
|
-
namespace facebook::react {
|
|
17
|
-
|
|
18
|
-
template <typename F>
|
|
19
|
-
class SyncCallback;
|
|
20
|
-
|
|
21
|
-
template <typename... Args>
|
|
22
|
-
class AsyncCallback {
|
|
23
|
-
public:
|
|
24
|
-
AsyncCallback(
|
|
25
|
-
jsi::Runtime& runtime,
|
|
26
|
-
jsi::Function function,
|
|
27
|
-
std::shared_ptr<CallInvoker> jsInvoker)
|
|
28
|
-
: callback_(std::make_shared<SyncCallback<void(Args...)>>(
|
|
29
|
-
runtime,
|
|
30
|
-
std::move(function),
|
|
31
|
-
std::move(jsInvoker))) {}
|
|
32
|
-
|
|
33
|
-
void operator()(Args... args) const noexcept {
|
|
34
|
-
call(std::forward<Args>(args)...);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
void call(Args... args) const noexcept {
|
|
38
|
-
callWithArgs(std::nullopt, std::forward<Args>(args)...);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
void callWithPriority(SchedulerPriority priority, Args... args)
|
|
42
|
-
const noexcept {
|
|
43
|
-
callWithArgs(priority, std::forward<Args>(args)...);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
void call(std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
|
|
47
|
-
const noexcept {
|
|
48
|
-
callWithFunction(std::nullopt, std::move(callImpl));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
void callWithPriority(
|
|
52
|
-
SchedulerPriority priority,
|
|
53
|
-
std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
|
|
54
|
-
const noexcept {
|
|
55
|
-
callWithFunction(priority, std::move(callImpl));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private:
|
|
59
|
-
friend Bridging<AsyncCallback>;
|
|
60
|
-
|
|
61
|
-
std::shared_ptr<SyncCallback<void(Args...)>> callback_;
|
|
62
|
-
|
|
63
|
-
void callWithArgs(std::optional<SchedulerPriority> priority, Args... args)
|
|
64
|
-
const noexcept {
|
|
65
|
-
if (auto wrapper = callback_->wrapper_.lock()) {
|
|
66
|
-
auto fn = [callback = callback_,
|
|
67
|
-
argsPtr = std::make_shared<std::tuple<Args...>>(
|
|
68
|
-
std::make_tuple(std::forward<Args>(args)...))](
|
|
69
|
-
jsi::Runtime&) { callback->apply(std::move(*argsPtr)); };
|
|
70
|
-
|
|
71
|
-
auto& jsInvoker = wrapper->jsInvoker();
|
|
72
|
-
if (priority) {
|
|
73
|
-
jsInvoker.invokeAsync(*priority, std::move(fn));
|
|
74
|
-
} else {
|
|
75
|
-
jsInvoker.invokeAsync(std::move(fn));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
void callWithFunction(
|
|
81
|
-
std::optional<SchedulerPriority> priority,
|
|
82
|
-
std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
|
|
83
|
-
const noexcept {
|
|
84
|
-
if (auto wrapper = callback_->wrapper_.lock()) {
|
|
85
|
-
// Capture callback_ and not wrapper_. If callback_ is deallocated or the
|
|
86
|
-
// JSVM is shutdown before the async task is scheduled, the underlying
|
|
87
|
-
// function will have been deallocated.
|
|
88
|
-
auto fn = [callback = callback_,
|
|
89
|
-
callImpl = std::move(callImpl)](jsi::Runtime& rt) {
|
|
90
|
-
if (auto wrapper2 = callback->wrapper_.lock()) {
|
|
91
|
-
callImpl(rt, wrapper2->callback());
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
auto& jsInvoker = wrapper->jsInvoker();
|
|
96
|
-
if (priority) {
|
|
97
|
-
jsInvoker.invokeAsync(*priority, std::move(fn));
|
|
98
|
-
} else {
|
|
99
|
-
jsInvoker.invokeAsync(std::move(fn));
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
// You must ensure that when invoking this you're located on the JS thread, or
|
|
106
|
-
// have exclusive control of the JS VM context. If you cannot ensure this, use
|
|
107
|
-
// AsyncCallback instead.
|
|
108
|
-
template <typename R, typename... Args>
|
|
109
|
-
class SyncCallback<R(Args...)> {
|
|
110
|
-
public:
|
|
111
|
-
SyncCallback(
|
|
112
|
-
jsi::Runtime& rt,
|
|
113
|
-
jsi::Function function,
|
|
114
|
-
std::shared_ptr<CallInvoker> jsInvoker)
|
|
115
|
-
: wrapper_(CallbackWrapper::createWeak(
|
|
116
|
-
std::move(function),
|
|
117
|
-
rt,
|
|
118
|
-
std::move(jsInvoker))) {}
|
|
119
|
-
|
|
120
|
-
// Disallow copying, as we can no longer safely destroy the callback
|
|
121
|
-
// from the destructor if there's multiple copies
|
|
122
|
-
SyncCallback(const SyncCallback&) = delete;
|
|
123
|
-
SyncCallback& operator=(const SyncCallback&) = delete;
|
|
124
|
-
|
|
125
|
-
// Allow move
|
|
126
|
-
SyncCallback(SyncCallback&& other) noexcept
|
|
127
|
-
: wrapper_(std::move(other.wrapper_)) {}
|
|
128
|
-
|
|
129
|
-
SyncCallback& operator=(SyncCallback&& other) noexcept {
|
|
130
|
-
wrapper_ = std::move(other.wrapper_);
|
|
131
|
-
return *this;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
~SyncCallback() {
|
|
135
|
-
if (auto wrapper = wrapper_.lock()) {
|
|
136
|
-
wrapper->destroy();
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
R operator()(Args... args) const {
|
|
141
|
-
return call(std::forward<Args>(args)...);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
R call(Args... args) const {
|
|
145
|
-
auto wrapper = wrapper_.lock();
|
|
146
|
-
|
|
147
|
-
// If the wrapper has been deallocated, we can no longer provide a return
|
|
148
|
-
// value consistently, so our only option is to throw
|
|
149
|
-
if (!wrapper) {
|
|
150
|
-
if constexpr (std::is_void_v<R>) {
|
|
151
|
-
return;
|
|
152
|
-
} else {
|
|
153
|
-
throw std::runtime_error("Failed to call invalidated sync callback");
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
auto& callback = wrapper->callback();
|
|
158
|
-
auto& rt = wrapper->runtime();
|
|
159
|
-
auto jsInvoker = wrapper->jsInvokerPtr();
|
|
160
|
-
|
|
161
|
-
if constexpr (std::is_void_v<R>) {
|
|
162
|
-
callback.call(
|
|
163
|
-
rt, bridging::toJs(rt, std::forward<Args>(args), jsInvoker)...);
|
|
164
|
-
} else {
|
|
165
|
-
return bridging::fromJs<R>(
|
|
166
|
-
rt,
|
|
167
|
-
callback.call(
|
|
168
|
-
rt, bridging::toJs(rt, std::forward<Args>(args), jsInvoker)...),
|
|
169
|
-
jsInvoker);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
private:
|
|
174
|
-
friend AsyncCallback<Args...>;
|
|
175
|
-
friend Bridging<SyncCallback>;
|
|
176
|
-
|
|
177
|
-
R apply(std::tuple<Args...>&& args) const {
|
|
178
|
-
return apply(std::move(args), std::index_sequence_for<Args...>{});
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
template <size_t... Index>
|
|
182
|
-
R apply(std::tuple<Args...>&& args, std::index_sequence<Index...>) const {
|
|
183
|
-
return call(std::move(std::get<Index>(args))...);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Held weakly so lifetime is managed by LongLivedObjectCollection.
|
|
187
|
-
std::weak_ptr<CallbackWrapper> wrapper_;
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
template <typename... Args>
|
|
191
|
-
struct Bridging<AsyncCallback<Args...>> {
|
|
192
|
-
static AsyncCallback<Args...> fromJs(
|
|
193
|
-
jsi::Runtime& rt,
|
|
194
|
-
jsi::Function&& value,
|
|
195
|
-
const std::shared_ptr<CallInvoker>& jsInvoker) {
|
|
196
|
-
return AsyncCallback<Args...>(rt, std::move(value), jsInvoker);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
static jsi::Function toJs(
|
|
200
|
-
jsi::Runtime& rt,
|
|
201
|
-
const AsyncCallback<Args...>& value) {
|
|
202
|
-
return value.callback_->function_.getFunction(rt);
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
template <typename R, typename... Args>
|
|
207
|
-
struct Bridging<SyncCallback<R(Args...)>> {
|
|
208
|
-
static SyncCallback<R(Args...)> fromJs(
|
|
209
|
-
jsi::Runtime& rt,
|
|
210
|
-
jsi::Function&& value,
|
|
211
|
-
const std::shared_ptr<CallInvoker>& jsInvoker) {
|
|
212
|
-
return SyncCallback<R(Args...)>(rt, std::move(value), jsInvoker);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
static jsi::Function toJs(
|
|
216
|
-
jsi::Runtime& rt,
|
|
217
|
-
const SyncCallback<R(Args...)>& value) {
|
|
218
|
-
return value.function_.getFunction(rt);
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
template <typename R, typename... Args>
|
|
223
|
-
struct Bridging<std::function<R(Args...)>> {
|
|
224
|
-
using Func = std::function<R(Args...)>;
|
|
225
|
-
using IndexSequence = std::index_sequence_for<Args...>;
|
|
226
|
-
|
|
227
|
-
static constexpr size_t kArgumentCount = sizeof...(Args);
|
|
228
|
-
|
|
229
|
-
static jsi::Function toJs(
|
|
230
|
-
jsi::Runtime& rt,
|
|
231
|
-
Func fn,
|
|
232
|
-
const std::shared_ptr<CallInvoker>& jsInvoker) {
|
|
233
|
-
return jsi::Function::createFromHostFunction(
|
|
234
|
-
rt,
|
|
235
|
-
jsi::PropNameID::forAscii(rt, "BridgedFunction"),
|
|
236
|
-
kArgumentCount,
|
|
237
|
-
[fn = std::make_shared<Func>(std::move(fn)), jsInvoker](
|
|
238
|
-
jsi::Runtime& rt,
|
|
239
|
-
const jsi::Value&,
|
|
240
|
-
const jsi::Value* args,
|
|
241
|
-
size_t count) -> jsi::Value {
|
|
242
|
-
if (count < kArgumentCount) {
|
|
243
|
-
throw jsi::JSError(rt, "Incorrect number of arguments");
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if constexpr (std::is_void_v<R>) {
|
|
247
|
-
callFromJs(*fn, rt, args, jsInvoker, IndexSequence{});
|
|
248
|
-
return jsi::Value();
|
|
249
|
-
} else {
|
|
250
|
-
return bridging::toJs(
|
|
251
|
-
rt,
|
|
252
|
-
callFromJs(*fn, rt, args, jsInvoker, IndexSequence{}),
|
|
253
|
-
jsInvoker);
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
private:
|
|
259
|
-
template <size_t... Index>
|
|
260
|
-
static R callFromJs(
|
|
261
|
-
Func& fn,
|
|
262
|
-
jsi::Runtime& rt,
|
|
263
|
-
const jsi::Value* args,
|
|
264
|
-
const std::shared_ptr<CallInvoker>& jsInvoker,
|
|
265
|
-
std::index_sequence<Index...>) {
|
|
266
|
-
return fn(bridging::fromJs<Args>(rt, args[Index], jsInvoker)...);
|
|
267
|
-
}
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
template <typename R, typename... Args>
|
|
271
|
-
struct Bridging<
|
|
272
|
-
std::function<R(Args...)>,
|
|
273
|
-
std::enable_if_t<
|
|
274
|
-
!std::is_same_v<std::function<R(Args...)>, std::function<R(Args...)>>>>
|
|
275
|
-
: Bridging<std::function<R(Args...)>> {};
|
|
276
|
-
|
|
277
|
-
template <typename R, typename... Args>
|
|
278
|
-
struct Bridging<R(Args...)> : Bridging<std::function<R(Args...)>> {};
|
|
279
|
-
|
|
280
|
-
template <typename R, typename... Args>
|
|
281
|
-
struct Bridging<R (*)(Args...)> : Bridging<std::function<R(Args...)>> {};
|
|
282
|
-
|
|
283
|
-
} // namespace facebook::react
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <react/bridging/Base.h>
|
|
11
|
+
#include <react/bridging/CallbackWrapper.h>
|
|
12
|
+
|
|
13
|
+
#include <ReactCommon/CallInvoker.h>
|
|
14
|
+
#include <ReactCommon/SchedulerPriority.h>
|
|
15
|
+
|
|
16
|
+
namespace facebook::react {
|
|
17
|
+
|
|
18
|
+
template <typename F>
|
|
19
|
+
class SyncCallback;
|
|
20
|
+
|
|
21
|
+
template <typename... Args>
|
|
22
|
+
class AsyncCallback {
|
|
23
|
+
public:
|
|
24
|
+
AsyncCallback(
|
|
25
|
+
jsi::Runtime& runtime,
|
|
26
|
+
jsi::Function function,
|
|
27
|
+
std::shared_ptr<CallInvoker> jsInvoker)
|
|
28
|
+
: callback_(std::make_shared<SyncCallback<void(Args...)>>(
|
|
29
|
+
runtime,
|
|
30
|
+
std::move(function),
|
|
31
|
+
std::move(jsInvoker))) {}
|
|
32
|
+
|
|
33
|
+
void operator()(Args... args) const noexcept {
|
|
34
|
+
call(std::forward<Args>(args)...);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void call(Args... args) const noexcept {
|
|
38
|
+
callWithArgs(std::nullopt, std::forward<Args>(args)...);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
void callWithPriority(SchedulerPriority priority, Args... args)
|
|
42
|
+
const noexcept {
|
|
43
|
+
callWithArgs(priority, std::forward<Args>(args)...);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void call(std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
|
|
47
|
+
const noexcept {
|
|
48
|
+
callWithFunction(std::nullopt, std::move(callImpl));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
void callWithPriority(
|
|
52
|
+
SchedulerPriority priority,
|
|
53
|
+
std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
|
|
54
|
+
const noexcept {
|
|
55
|
+
callWithFunction(priority, std::move(callImpl));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private:
|
|
59
|
+
friend Bridging<AsyncCallback>;
|
|
60
|
+
|
|
61
|
+
std::shared_ptr<SyncCallback<void(Args...)>> callback_;
|
|
62
|
+
|
|
63
|
+
void callWithArgs(std::optional<SchedulerPriority> priority, Args... args)
|
|
64
|
+
const noexcept {
|
|
65
|
+
if (auto wrapper = callback_->wrapper_.lock()) {
|
|
66
|
+
auto fn = [callback = callback_,
|
|
67
|
+
argsPtr = std::make_shared<std::tuple<Args...>>(
|
|
68
|
+
std::make_tuple(std::forward<Args>(args)...))](
|
|
69
|
+
jsi::Runtime&) { callback->apply(std::move(*argsPtr)); };
|
|
70
|
+
|
|
71
|
+
auto& jsInvoker = wrapper->jsInvoker();
|
|
72
|
+
if (priority) {
|
|
73
|
+
jsInvoker.invokeAsync(*priority, std::move(fn));
|
|
74
|
+
} else {
|
|
75
|
+
jsInvoker.invokeAsync(std::move(fn));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void callWithFunction(
|
|
81
|
+
std::optional<SchedulerPriority> priority,
|
|
82
|
+
std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
|
|
83
|
+
const noexcept {
|
|
84
|
+
if (auto wrapper = callback_->wrapper_.lock()) {
|
|
85
|
+
// Capture callback_ and not wrapper_. If callback_ is deallocated or the
|
|
86
|
+
// JSVM is shutdown before the async task is scheduled, the underlying
|
|
87
|
+
// function will have been deallocated.
|
|
88
|
+
auto fn = [callback = callback_,
|
|
89
|
+
callImpl = std::move(callImpl)](jsi::Runtime& rt) {
|
|
90
|
+
if (auto wrapper2 = callback->wrapper_.lock()) {
|
|
91
|
+
callImpl(rt, wrapper2->callback());
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
auto& jsInvoker = wrapper->jsInvoker();
|
|
96
|
+
if (priority) {
|
|
97
|
+
jsInvoker.invokeAsync(*priority, std::move(fn));
|
|
98
|
+
} else {
|
|
99
|
+
jsInvoker.invokeAsync(std::move(fn));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// You must ensure that when invoking this you're located on the JS thread, or
|
|
106
|
+
// have exclusive control of the JS VM context. If you cannot ensure this, use
|
|
107
|
+
// AsyncCallback instead.
|
|
108
|
+
template <typename R, typename... Args>
|
|
109
|
+
class SyncCallback<R(Args...)> {
|
|
110
|
+
public:
|
|
111
|
+
SyncCallback(
|
|
112
|
+
jsi::Runtime& rt,
|
|
113
|
+
jsi::Function function,
|
|
114
|
+
std::shared_ptr<CallInvoker> jsInvoker)
|
|
115
|
+
: wrapper_(CallbackWrapper::createWeak(
|
|
116
|
+
std::move(function),
|
|
117
|
+
rt,
|
|
118
|
+
std::move(jsInvoker))) {}
|
|
119
|
+
|
|
120
|
+
// Disallow copying, as we can no longer safely destroy the callback
|
|
121
|
+
// from the destructor if there's multiple copies
|
|
122
|
+
SyncCallback(const SyncCallback&) = delete;
|
|
123
|
+
SyncCallback& operator=(const SyncCallback&) = delete;
|
|
124
|
+
|
|
125
|
+
// Allow move
|
|
126
|
+
SyncCallback(SyncCallback&& other) noexcept
|
|
127
|
+
: wrapper_(std::move(other.wrapper_)) {}
|
|
128
|
+
|
|
129
|
+
SyncCallback& operator=(SyncCallback&& other) noexcept {
|
|
130
|
+
wrapper_ = std::move(other.wrapper_);
|
|
131
|
+
return *this;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
~SyncCallback() {
|
|
135
|
+
if (auto wrapper = wrapper_.lock()) {
|
|
136
|
+
wrapper->destroy();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
R operator()(Args... args) const {
|
|
141
|
+
return call(std::forward<Args>(args)...);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
R call(Args... args) const {
|
|
145
|
+
auto wrapper = wrapper_.lock();
|
|
146
|
+
|
|
147
|
+
// If the wrapper has been deallocated, we can no longer provide a return
|
|
148
|
+
// value consistently, so our only option is to throw
|
|
149
|
+
if (!wrapper) {
|
|
150
|
+
if constexpr (std::is_void_v<R>) {
|
|
151
|
+
return;
|
|
152
|
+
} else {
|
|
153
|
+
throw std::runtime_error("Failed to call invalidated sync callback");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
auto& callback = wrapper->callback();
|
|
158
|
+
auto& rt = wrapper->runtime();
|
|
159
|
+
auto jsInvoker = wrapper->jsInvokerPtr();
|
|
160
|
+
|
|
161
|
+
if constexpr (std::is_void_v<R>) {
|
|
162
|
+
callback.call(
|
|
163
|
+
rt, bridging::toJs(rt, std::forward<Args>(args), jsInvoker)...);
|
|
164
|
+
} else {
|
|
165
|
+
return bridging::fromJs<R>(
|
|
166
|
+
rt,
|
|
167
|
+
callback.call(
|
|
168
|
+
rt, bridging::toJs(rt, std::forward<Args>(args), jsInvoker)...),
|
|
169
|
+
jsInvoker);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private:
|
|
174
|
+
friend AsyncCallback<Args...>;
|
|
175
|
+
friend Bridging<SyncCallback>;
|
|
176
|
+
|
|
177
|
+
R apply(std::tuple<Args...>&& args) const {
|
|
178
|
+
return apply(std::move(args), std::index_sequence_for<Args...>{});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
template <size_t... Index>
|
|
182
|
+
R apply(std::tuple<Args...>&& args, std::index_sequence<Index...>) const {
|
|
183
|
+
return call(std::move(std::get<Index>(args))...);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Held weakly so lifetime is managed by LongLivedObjectCollection.
|
|
187
|
+
std::weak_ptr<CallbackWrapper> wrapper_;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
template <typename... Args>
|
|
191
|
+
struct Bridging<AsyncCallback<Args...>> {
|
|
192
|
+
static AsyncCallback<Args...> fromJs(
|
|
193
|
+
jsi::Runtime& rt,
|
|
194
|
+
jsi::Function&& value,
|
|
195
|
+
const std::shared_ptr<CallInvoker>& jsInvoker) {
|
|
196
|
+
return AsyncCallback<Args...>(rt, std::move(value), jsInvoker);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
static jsi::Function toJs(
|
|
200
|
+
jsi::Runtime& rt,
|
|
201
|
+
const AsyncCallback<Args...>& value) {
|
|
202
|
+
return value.callback_->function_.getFunction(rt);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
template <typename R, typename... Args>
|
|
207
|
+
struct Bridging<SyncCallback<R(Args...)>> {
|
|
208
|
+
static SyncCallback<R(Args...)> fromJs(
|
|
209
|
+
jsi::Runtime& rt,
|
|
210
|
+
jsi::Function&& value,
|
|
211
|
+
const std::shared_ptr<CallInvoker>& jsInvoker) {
|
|
212
|
+
return SyncCallback<R(Args...)>(rt, std::move(value), jsInvoker);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
static jsi::Function toJs(
|
|
216
|
+
jsi::Runtime& rt,
|
|
217
|
+
const SyncCallback<R(Args...)>& value) {
|
|
218
|
+
return value.function_.getFunction(rt);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
template <typename R, typename... Args>
|
|
223
|
+
struct Bridging<std::function<R(Args...)>> {
|
|
224
|
+
using Func = std::function<R(Args...)>;
|
|
225
|
+
using IndexSequence = std::index_sequence_for<Args...>;
|
|
226
|
+
|
|
227
|
+
static constexpr size_t kArgumentCount = sizeof...(Args);
|
|
228
|
+
|
|
229
|
+
static jsi::Function toJs(
|
|
230
|
+
jsi::Runtime& rt,
|
|
231
|
+
Func fn,
|
|
232
|
+
const std::shared_ptr<CallInvoker>& jsInvoker) {
|
|
233
|
+
return jsi::Function::createFromHostFunction(
|
|
234
|
+
rt,
|
|
235
|
+
jsi::PropNameID::forAscii(rt, "BridgedFunction"),
|
|
236
|
+
kArgumentCount,
|
|
237
|
+
[fn = std::make_shared<Func>(std::move(fn)), jsInvoker](
|
|
238
|
+
jsi::Runtime& rt,
|
|
239
|
+
const jsi::Value&,
|
|
240
|
+
const jsi::Value* args,
|
|
241
|
+
size_t count) -> jsi::Value {
|
|
242
|
+
if (count < kArgumentCount) {
|
|
243
|
+
throw jsi::JSError(rt, "Incorrect number of arguments");
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if constexpr (std::is_void_v<R>) {
|
|
247
|
+
callFromJs(*fn, rt, args, jsInvoker, IndexSequence{});
|
|
248
|
+
return jsi::Value();
|
|
249
|
+
} else {
|
|
250
|
+
return bridging::toJs(
|
|
251
|
+
rt,
|
|
252
|
+
callFromJs(*fn, rt, args, jsInvoker, IndexSequence{}),
|
|
253
|
+
jsInvoker);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private:
|
|
259
|
+
template <size_t... Index>
|
|
260
|
+
static R callFromJs(
|
|
261
|
+
Func& fn,
|
|
262
|
+
jsi::Runtime& rt,
|
|
263
|
+
const jsi::Value* args,
|
|
264
|
+
const std::shared_ptr<CallInvoker>& jsInvoker,
|
|
265
|
+
std::index_sequence<Index...>) {
|
|
266
|
+
return fn(bridging::fromJs<Args>(rt, args[Index], jsInvoker)...);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
template <typename R, typename... Args>
|
|
271
|
+
struct Bridging<
|
|
272
|
+
std::function<R(Args...)>,
|
|
273
|
+
std::enable_if_t<
|
|
274
|
+
!std::is_same_v<std::function<R(Args...)>, std::function<R(Args...)>>>>
|
|
275
|
+
: Bridging<std::function<R(Args...)>> {};
|
|
276
|
+
|
|
277
|
+
template <typename R, typename... Args>
|
|
278
|
+
struct Bridging<R(Args...)> : Bridging<std::function<R(Args...)>> {};
|
|
279
|
+
|
|
280
|
+
template <typename R, typename... Args>
|
|
281
|
+
struct Bridging<R (*)(Args...)> : Bridging<std::function<R(Args...)>> {};
|
|
282
|
+
|
|
283
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include "LongLivedObject.h"
|
|
9
|
+
#include <unordered_map>
|
|
10
|
+
|
|
11
|
+
namespace facebook::react {
|
|
12
|
+
|
|
13
|
+
// LongLivedObjectCollection
|
|
14
|
+
|
|
15
|
+
LongLivedObjectCollection& LongLivedObjectCollection::get(
|
|
16
|
+
jsi::Runtime& runtime) {
|
|
17
|
+
static std::unordered_map<void*, std::shared_ptr<LongLivedObjectCollection>>
|
|
18
|
+
instances;
|
|
19
|
+
static std::mutex instancesMutex;
|
|
20
|
+
|
|
21
|
+
std::scoped_lock lock(instancesMutex);
|
|
22
|
+
void* key = static_cast<void*>(&runtime);
|
|
23
|
+
auto entry = instances.find(key);
|
|
24
|
+
if (entry == instances.end()) {
|
|
25
|
+
entry =
|
|
26
|
+
instances.emplace(key, std::make_shared<LongLivedObjectCollection>())
|
|
27
|
+
.first;
|
|
28
|
+
}
|
|
29
|
+
return *(entry->second);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
void LongLivedObjectCollection::add(std::shared_ptr<LongLivedObject> so) {
|
|
33
|
+
std::scoped_lock lock(collectionMutex_);
|
|
34
|
+
collection_.insert(std::move(so));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void LongLivedObjectCollection::remove(const LongLivedObject* o) {
|
|
38
|
+
std::scoped_lock lock(collectionMutex_);
|
|
39
|
+
for (auto p = collection_.begin(); p != collection_.end(); p++) {
|
|
40
|
+
if (p->get() == o) {
|
|
41
|
+
collection_.erase(p);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
void LongLivedObjectCollection::clear() {
|
|
48
|
+
std::scoped_lock lock(collectionMutex_);
|
|
49
|
+
collection_.clear();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
size_t LongLivedObjectCollection::size() const {
|
|
53
|
+
std::scoped_lock lock(collectionMutex_);
|
|
54
|
+
return collection_.size();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// LongLivedObject
|
|
58
|
+
|
|
59
|
+
void LongLivedObject::allowRelease() {
|
|
60
|
+
LongLivedObjectCollection::get(runtime_).remove(this);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
} // namespace facebook::react
|