react-native-windows 0.72.14 → 0.73.0-preview.1

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 (587) hide show
  1. package/.flowconfig +16 -5
  2. package/Chakra/ChakraHelpers.cpp +1 -1
  3. package/Chakra/ChakraUtils.cpp +1 -1
  4. package/Chakra/ChakraValue.h +1 -1
  5. package/Common/packages.lock.json +13 -0
  6. package/Directory.Build.props +6 -2
  7. package/Folly/TEMP_UntilFollyUpdate/dynamic-inl.h +1 -10
  8. package/Folly/TEMP_UntilFollyUpdate/hash/Hash.h +1016 -0
  9. package/Folly/TEMP_UntilFollyUpdate/lang/ToAscii.h +1 -1
  10. package/Folly/cgmanifest.json +1 -1
  11. package/Folly/packages.lock.json +23 -0
  12. package/Libraries/Animated/Animated.js +1 -1
  13. package/Libraries/Animated/AnimatedImplementation.js +1 -1
  14. package/Libraries/Animated/NativeAnimatedHelper.js +14 -10
  15. package/Libraries/Animated/NativeAnimatedModule.js +6 -2
  16. package/Libraries/Animated/NativeAnimatedTurboModule.js +7 -4
  17. package/Libraries/Animated/animations/Animation.js +57 -3
  18. package/Libraries/Animated/animations/DecayAnimation.js +9 -0
  19. package/Libraries/Animated/animations/SpringAnimation.js +8 -0
  20. package/Libraries/Animated/animations/TimingAnimation.js +8 -0
  21. package/Libraries/Animated/components/AnimatedFlatList.js +2 -1
  22. package/Libraries/Animated/components/AnimatedScrollView.js +2 -0
  23. package/Libraries/Animated/components/AnimatedSectionList.js +2 -1
  24. package/Libraries/Animated/createAnimatedComponent.js +1 -0
  25. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  26. package/Libraries/Animated/nodes/AnimatedObject.js +146 -0
  27. package/Libraries/Animated/nodes/AnimatedProps.js +19 -7
  28. package/Libraries/Animated/nodes/AnimatedStyle.js +29 -55
  29. package/Libraries/Animated/nodes/AnimatedValueXY.js +3 -17
  30. package/Libraries/Animated/shouldUseTurboAnimatedModule.js +17 -0
  31. package/Libraries/Animated/useAnimatedProps.js +9 -10
  32. package/Libraries/AppState/AppState.d.ts +1 -1
  33. package/Libraries/AppState/NativeAppState.js +8 -4
  34. package/Libraries/AppTheme/AppTheme.js +5 -5
  35. package/Libraries/BatchedBridge/MessageQueue.js +45 -36
  36. package/Libraries/Blob/Blob.js +6 -2
  37. package/Libraries/Blob/BlobManager.js +9 -10
  38. package/Libraries/Blob/BlobRegistry.js +14 -9
  39. package/Libraries/Blob/File.js +1 -1
  40. package/Libraries/Blob/FileReader.js +1 -2
  41. package/Libraries/Components/Clipboard/Clipboard.d.ts +4 -4
  42. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +3 -1
  43. package/Libraries/Components/Glyph/Glyph.js +1 -1
  44. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +26 -6
  45. package/Libraries/Components/Keyboard/KeyboardExt.d.ts +4 -1
  46. package/Libraries/Components/Keyboard/KeyboardExt.js +3 -0
  47. package/Libraries/Components/Keyboard/KeyboardExt.js.map +1 -1
  48. package/Libraries/Components/Keyboard/KeyboardExtProps.d.ts +4 -29
  49. package/Libraries/Components/Keyboard/KeyboardExtProps.js +0 -17
  50. package/Libraries/Components/Keyboard/KeyboardExtProps.js.map +1 -1
  51. package/Libraries/Components/Pressable/Pressable.js +3 -2
  52. package/Libraries/Components/Pressable/Pressable.windows.js +4 -3
  53. package/Libraries/Components/Pressable/useAndroidRippleForView.js +1 -1
  54. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.js +20 -0
  55. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.windows.js +7 -1
  56. package/Libraries/Components/SafeAreaView/SafeAreaView.js +7 -7
  57. package/Libraries/Components/SafeAreaView/SafeAreaView.windows.js +7 -10
  58. package/Libraries/Components/ScrollView/ScrollView.js +3 -1
  59. package/Libraries/Components/ScrollView/ScrollView.windows.js +3 -1
  60. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +39 -46
  61. package/Libraries/Components/Switch/Switch.js +1 -0
  62. package/Libraries/Components/Switch/Switch.windows.js +259 -0
  63. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +1 -0
  64. package/Libraries/Components/TextInput/TextInput.d.ts +49 -7
  65. package/Libraries/Components/TextInput/TextInput.flow.js +43 -10
  66. package/Libraries/Components/TextInput/TextInput.js +62 -10
  67. package/Libraries/Components/TextInput/TextInput.windows.js +100 -14
  68. package/Libraries/Components/ToastAndroid/{ToastAndroid.ios.js → ToastAndroid.js} +9 -1
  69. package/Libraries/Components/ToastAndroid/ToastAndroid.windows.js +9 -1
  70. package/Libraries/Components/Touchable/TouchableBounce.js +1 -1
  71. package/Libraries/Components/Touchable/TouchableHighlight.js +1 -1
  72. package/Libraries/Components/Touchable/TouchableHighlight.windows.js +1 -1
  73. package/Libraries/Components/Touchable/TouchableNativeFeedback.js +1 -1
  74. package/Libraries/Components/Touchable/TouchableOpacity.js +4 -1
  75. package/Libraries/Components/Touchable/TouchableOpacity.windows.js +4 -1
  76. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -0
  77. package/Libraries/Components/Touchable/TouchableWithoutFeedback.windows.js +1 -0
  78. package/Libraries/Components/TraceUpdateOverlay/TraceUpdateOverlay.js +16 -6
  79. package/Libraries/Components/View/ReactNativeStyleAttributes.js +9 -0
  80. package/Libraries/Components/View/ReactNativeViewAttributes.js +1 -0
  81. package/Libraries/Components/View/ReactNativeViewAttributes.windows.js +1 -0
  82. package/Libraries/Components/View/View.js +46 -32
  83. package/Libraries/Components/View/View.windows.js +23 -7
  84. package/Libraries/Components/View/ViewAccessibility.d.ts +27 -1
  85. package/Libraries/Components/View/ViewAccessibility.windows.js +3 -0
  86. package/Libraries/Components/View/ViewNativeComponent.js +1 -0
  87. package/Libraries/Components/View/ViewPropTypes.d.ts +104 -1
  88. package/Libraries/Components/View/ViewPropTypes.js +18 -3
  89. package/Libraries/Components/View/ViewPropTypes.windows.js +33 -3
  90. package/Libraries/Core/Devtools/loadBundleFromServer.js +152 -0
  91. package/Libraries/Core/Devtools/symbolicateStackTrace.js +2 -1
  92. package/Libraries/Core/ExceptionsManager.js +16 -7
  93. package/Libraries/Core/ExtendedError.js +12 -0
  94. package/Libraries/Core/ReactNativeVersion.js +3 -3
  95. package/Libraries/Core/ReactNativeVersionCheck.js +0 -2
  96. package/Libraries/Core/__mocks__/NativeExceptionsManager.js +20 -0
  97. package/Libraries/Core/setUpDeveloperTools.js +5 -1
  98. package/Libraries/Core/setUpIntersectionObserver.js +16 -0
  99. package/Libraries/Core/setUpMutationObserver.js +16 -0
  100. package/Libraries/Core/setUpPerformance.js +6 -13
  101. package/Libraries/Core/setUpPerformanceObserver.js +16 -0
  102. package/Libraries/Core/setUpRegeneratorRuntime.js +4 -2
  103. package/Libraries/DOM/Nodes/ReactNativeElement.js +135 -18
  104. package/Libraries/DOM/Nodes/ReadOnlyCharacterData.js +72 -0
  105. package/Libraries/DOM/Nodes/ReadOnlyElement.js +209 -21
  106. package/Libraries/DOM/Nodes/ReadOnlyNode.js +206 -17
  107. package/Libraries/DOM/Nodes/ReadOnlyText.js +30 -0
  108. package/Libraries/DOM/Nodes/Utilities/Traversal.js +54 -0
  109. package/Libraries/EventEmitter/NativeEventEmitter.d.ts +0 -6
  110. package/Libraries/EventEmitter/RCTDeviceEventEmitter.js +15 -4
  111. package/Libraries/Image/Image.android.js +8 -2
  112. package/Libraries/Image/Image.d.ts +1 -1
  113. package/Libraries/Image/Image.ios.js +4 -1
  114. package/Libraries/Image/Image.windows.js +6 -3
  115. package/Libraries/Image/ImageBackground.js +3 -0
  116. package/Libraries/Inspector/DevtoolsOverlay.js +6 -3
  117. package/Libraries/Inspector/NetworkOverlay.js +2 -2
  118. package/Libraries/Interaction/JSEventLoopWatchdog.js +1 -5
  119. package/Libraries/Interaction/PanResponder.js +1 -4
  120. package/Libraries/IntersectionObserver/IntersectionObserver.js +252 -0
  121. package/Libraries/IntersectionObserver/IntersectionObserverEntry.js +140 -0
  122. package/Libraries/IntersectionObserver/IntersectionObserverManager.js +221 -0
  123. package/Libraries/IntersectionObserver/NativeIntersectionObserver.js +41 -0
  124. package/Libraries/IntersectionObserver/__mocks__/NativeIntersectionObserver.js +162 -0
  125. package/Libraries/LayoutAnimation/LayoutAnimation.js +1 -1
  126. package/Libraries/Lists/FlatList.d.ts +2 -1
  127. package/Libraries/Lists/FlatList.js +15 -5
  128. package/Libraries/Lists/SectionList.js +4 -0
  129. package/Libraries/LogBox/Data/LogBoxLog.js +4 -1
  130. package/Libraries/LogBox/Data/LogBoxSymbolication.js +5 -2
  131. package/Libraries/LogBox/Data/parseLogBoxLog.js +57 -20
  132. package/Libraries/LogBox/UI/AnsiHighlight.js +1 -1
  133. package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +24 -31
  134. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
  135. package/Libraries/LogBox/UI/LogBoxMessage.js +4 -7
  136. package/Libraries/MutationObserver/MutationObserver.js +184 -0
  137. package/Libraries/MutationObserver/MutationObserverManager.js +218 -0
  138. package/Libraries/MutationObserver/MutationRecord.js +82 -0
  139. package/Libraries/MutationObserver/NativeMutationObserver.js +58 -0
  140. package/Libraries/MutationObserver/__mocks__/NativeMutationObserver.js +327 -0
  141. package/Libraries/NativeComponent/BaseViewConfig.android.js +18 -3
  142. package/Libraries/NativeComponent/BaseViewConfig.ios.js +33 -0
  143. package/Libraries/NativeComponent/BaseViewConfig.windows.js +34 -4
  144. package/Libraries/NativeComponent/NativeComponentRegistry.js +3 -5
  145. package/Libraries/NativeModules/specs/NativeSourceCode.js +6 -6
  146. package/Libraries/Network/RCTNetworking.android.js +2 -1
  147. package/Libraries/Network/XMLHttpRequest.js +1 -1
  148. package/Libraries/NewAppScreen/components/DebugInstructions.js +4 -4
  149. package/Libraries/NewAppScreen/components/DebugInstructions.windows.js +2 -2
  150. package/Libraries/NewAppScreen/components/LearnMoreLinks.js +9 -2
  151. package/Libraries/Performance/QuickPerformanceLogger.js +1 -1
  152. package/Libraries/PermissionsAndroid/NativePermissionsAndroid.js +1 -0
  153. package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +1 -0
  154. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +3 -1
  155. package/Libraries/Pressability/Pressability.js +28 -3
  156. package/Libraries/Pressability/Pressability.windows.js +30 -5
  157. package/Libraries/ReactNative/AppContainer.js +2 -3
  158. package/Libraries/ReactNative/AppRegistry.d.ts +0 -5
  159. package/Libraries/ReactNative/AppRegistry.js +66 -53
  160. package/Libraries/ReactNative/BridgelessUIManager.js +38 -9
  161. package/Libraries/ReactNative/FabricUIManager.js +143 -34
  162. package/Libraries/ReactNative/I18nManager.js +5 -11
  163. package/Libraries/ReactNative/NativeI18nManager.js +7 -5
  164. package/Libraries/ReactNative/PaperUIManager.windows.js +2 -2
  165. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +151 -0
  166. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance.js +81 -0
  167. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactNativeAttributePayload.js +492 -0
  168. package/Libraries/ReactNative/ReactFabricPublicInstance/warnForStyleProps.js +32 -0
  169. package/Libraries/ReactNative/ReactNativeFeatureFlags.js +19 -3
  170. package/Libraries/ReactNative/UIManager.js +8 -0
  171. package/Libraries/ReactNative/__mocks__/FabricUIManager.js +648 -0
  172. package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +38 -2
  173. package/Libraries/Renderer/implementations/ReactFabric-dev.js +27 -27
  174. package/Libraries/Renderer/implementations/ReactFabric-prod.js +3 -3
  175. package/Libraries/Renderer/implementations/ReactFabric-profiling.js +3 -3
  176. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +27 -27
  177. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +3 -3
  178. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +3 -3
  179. package/Libraries/Renderer/shims/ReactFabric.js +5 -6
  180. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -3
  181. package/Libraries/Renderer/shims/ReactNative.js +2 -3
  182. package/Libraries/Renderer/shims/ReactNativeTypes.js +35 -17
  183. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +3 -3
  184. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -3
  185. package/Libraries/Settings/{Settings.android.js → Settings.js} +4 -4
  186. package/Libraries/Share/Share.d.ts +3 -9
  187. package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +9 -4
  188. package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +28 -13
  189. package/Libraries/StyleSheet/PlatformColorValueTypes.windows.js +10 -6
  190. package/Libraries/StyleSheet/PlatformColorValueTypesIOS.ios.js +1 -1
  191. package/Libraries/StyleSheet/StyleSheet.d.ts +10 -1
  192. package/Libraries/StyleSheet/StyleSheet.js +3 -0
  193. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +31 -17
  194. package/Libraries/StyleSheet/StyleSheetTypes.js +90 -6
  195. package/Libraries/StyleSheet/flattenStyle.js +4 -0
  196. package/Libraries/StyleSheet/private/_TransformStyle.js +16 -2
  197. package/Libraries/StyleSheet/processColor.js +1 -2
  198. package/Libraries/StyleSheet/processTransformOrigin.js +136 -0
  199. package/Libraries/StyleSheet/splitLayoutProps.js +1 -0
  200. package/Libraries/Text/Text.d.ts +5 -5
  201. package/Libraries/Text/Text.js +17 -10
  202. package/Libraries/Text/Text.windows.js +53 -20
  203. package/Libraries/Text/TextProps.windows.js +275 -0
  204. package/Libraries/TurboModule/TurboModuleRegistry.js +47 -7
  205. package/Libraries/TurboModule/samples/NativeSampleTurboModule.js +6 -0
  206. package/Libraries/Types/CoreEventTypes.d.ts +5 -2
  207. package/Libraries/Utilities/GlobalPerformanceLogger.js +2 -12
  208. package/Libraries/Utilities/NativeDeviceInfo.js +8 -9
  209. package/Libraries/Utilities/NativePlatformConstantsAndroid.js +23 -18
  210. package/Libraries/Utilities/NativePlatformConstantsIOS.js +16 -13
  211. package/Libraries/Utilities/NativePlatformConstantsWin.js +13 -10
  212. package/Libraries/Utilities/PerformanceLoggerContext.js +1 -1
  213. package/Libraries/Utilities/Platform.android.js +12 -8
  214. package/Libraries/Utilities/Platform.d.ts +1 -0
  215. package/Libraries/Utilities/Platform.flow.js +84 -0
  216. package/Libraries/Utilities/Platform.flow.windows.js +111 -0
  217. package/Libraries/Utilities/Platform.ios.js +12 -8
  218. package/Libraries/Utilities/Platform.windows.js +12 -8
  219. package/Libraries/Utilities/PolyfillFunctions.js +1 -1
  220. package/Libraries/Utilities/ReactNativeTestTools.js +1 -2
  221. package/Libraries/Utilities/SceneTracker.js +1 -1
  222. package/Libraries/Utilities/createPerformanceLogger.js +63 -32
  223. package/Libraries/Utilities/useColorScheme.js +7 -8
  224. package/Libraries/WebPerformance/MemoryInfo.js +1 -1
  225. package/Libraries/WebPerformance/NativePerformance.js +3 -8
  226. package/Libraries/WebPerformance/NativePerformanceObserver.js +4 -0
  227. package/Libraries/WebPerformance/Performance.js +42 -15
  228. package/Libraries/WebPerformance/PerformanceEntry.js +14 -6
  229. package/Libraries/WebPerformance/PerformanceEventTiming.js +18 -1
  230. package/Libraries/WebPerformance/ReactNativeStartupTiming.js +40 -14
  231. package/Libraries/WebPerformance/__mocks__/NativePerformance.js +4 -2
  232. package/Libraries/WebPerformance/__mocks__/NativePerformanceObserver.js +21 -3
  233. package/Libraries/__tests__/ViewWindows-test.js +3 -3
  234. package/Libraries/platform-types.d.ts +6 -2
  235. package/Libraries/promiseRejectionTrackingOptions.js +1 -3
  236. package/Libraries/vendor/emitter/EventEmitter.js +17 -17
  237. package/Microsoft.ReactNative/Composition.Input.idl +103 -0
  238. package/Microsoft.ReactNative/CompositionContext.idl +31 -8
  239. package/Microsoft.ReactNative/CompositionRootView.idl +8 -4
  240. package/Microsoft.ReactNative/CompositionSwitcher.idl +28 -17
  241. package/Microsoft.ReactNative/Fabric/AbiViewComponentDescriptor.cpp +15 -28
  242. package/Microsoft.ReactNative/Fabric/AbiViewComponentDescriptor.h +7 -10
  243. package/Microsoft.ReactNative/Fabric/ComponentView.h +42 -4
  244. package/Microsoft.ReactNative/Fabric/Composition/AbiCompositionViewComponentView.cpp +57 -4
  245. package/Microsoft.ReactNative/Fabric/Composition/AbiCompositionViewComponentView.h +22 -1
  246. package/Microsoft.ReactNative/Fabric/Composition/ActivityIndicatorComponentView.cpp +137 -0
  247. package/Microsoft.ReactNative/Fabric/Composition/ActivityIndicatorComponentView.h +59 -0
  248. package/Microsoft.ReactNative/Fabric/Composition/ComponentViewRegistry.cpp +8 -2
  249. package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.cpp +575 -0
  250. package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.h +170 -0
  251. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +890 -226
  252. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.h +38 -6
  253. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper_emptyimpl.cpp +79 -0
  254. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +130 -27
  255. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.h +6 -1
  256. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +382 -228
  257. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +35 -8
  258. package/Microsoft.ReactNative/Fabric/Composition/CompositionHelpers.h +46 -8
  259. package/Microsoft.ReactNative/Fabric/Composition/CompositionHwndHost.cpp +5 -21
  260. package/Microsoft.ReactNative/Fabric/Composition/CompositionHwndHost.h +1 -1
  261. package/Microsoft.ReactNative/Fabric/Composition/CompositionRootAutomationProvider.cpp +232 -4
  262. package/Microsoft.ReactNative/Fabric/Composition/CompositionRootAutomationProvider.h +36 -1
  263. package/Microsoft.ReactNative/Fabric/Composition/CompositionRootView.cpp +51 -14
  264. package/Microsoft.ReactNative/Fabric/Composition/CompositionRootView.h +15 -6
  265. package/Microsoft.ReactNative/Fabric/Composition/CompositionRootView_emptyimpl.cpp +123 -0
  266. package/Microsoft.ReactNative/Fabric/Composition/CompositionUIService_emptyimpl.cpp +18 -0
  267. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +333 -137
  268. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.h +52 -8
  269. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.cpp +32 -26
  270. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.h +5 -3
  271. package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp +183 -175
  272. package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.h +7 -4
  273. package/Microsoft.ReactNative/Fabric/Composition/ReactCompositionViewComponentBuilder.cpp +101 -2
  274. package/Microsoft.ReactNative/Fabric/Composition/ReactCompositionViewComponentBuilder.h +46 -2
  275. package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.cpp +36 -9
  276. package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.h +8 -2
  277. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +247 -42
  278. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.h +25 -8
  279. package/Microsoft.ReactNative/Fabric/Composition/SwitchComponentView.cpp +78 -50
  280. package/Microsoft.ReactNative/Fabric/Composition/SwitchComponentView.h +12 -4
  281. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentDescriptor.h +26 -28
  282. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +429 -89
  283. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h +24 -3
  284. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputProps.cpp +1 -0
  285. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputProps.h +3 -2
  286. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.cpp +5 -7
  287. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.h +4 -6
  288. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputState.cpp +1 -7
  289. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputState.h +1 -17
  290. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +74 -3
  291. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +12 -0
  292. package/Microsoft.ReactNative/Fabric/Composition/UnimplementedNativeViewComponentView.cpp +53 -59
  293. package/Microsoft.ReactNative/Fabric/Composition/UnimplementedNativeViewComponentView.h +3 -2
  294. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +5 -4
  295. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.h +2 -1
  296. package/Microsoft.ReactNative/Fabric/ImageRequest.cpp +1 -1
  297. package/Microsoft.ReactNative/Fabric/ReactTaggedView.h +1 -1
  298. package/Microsoft.ReactNative/Fabric/WindowsComponentDescriptorRegistry.cpp +3 -4
  299. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformTouch.h +10 -0
  300. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewEventEmitter.cpp +59 -0
  301. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewEventEmitter.h +31 -0
  302. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewProps.cpp +69 -0
  303. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewProps.h +25 -2
  304. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewTraitsInitializer.h +23 -0
  305. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/KeyEvent.h +113 -0
  306. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/WindowsViewEvents.h +75 -0
  307. package/Microsoft.ReactNative/Fabric/platform/react/renderer/core/graphicsConversions.h +18 -21
  308. package/Microsoft.ReactNative/Fabric/platform/react/renderer/graphics/Color.cpp +158 -7
  309. package/Microsoft.ReactNative/Fabric/platform/react/renderer/graphics/Color.h +15 -17
  310. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/TextLayoutManager.cpp +1 -1
  311. package/Microsoft.ReactNative/GlyphViewManager.cpp +1 -1
  312. package/Microsoft.ReactNative/IJSValueReader.idl +2 -2
  313. package/Microsoft.ReactNative/IJSValueWriter.idl +2 -2
  314. package/Microsoft.ReactNative/IReactCompositionViewComponentBuilder.idl +23 -1
  315. package/Microsoft.ReactNative/IReactContext.cpp +1 -1
  316. package/Microsoft.ReactNative/IReactNotificationService.cpp +4 -3
  317. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -4
  318. package/Microsoft.ReactNative/Modules/AlertModule.cpp +2 -2
  319. package/Microsoft.ReactNative/Modules/Animated/NativeAnimatedNodeManager.cpp +1 -2
  320. package/Microsoft.ReactNative/Modules/Animated/NativeAnimatedNodeManager.h +1 -1
  321. package/Microsoft.ReactNative/Modules/Animated/PropsAnimatedNode.cpp +3 -4
  322. package/Microsoft.ReactNative/Modules/AppStateModule.cpp +1 -1
  323. package/Microsoft.ReactNative/Modules/AppStateModule.h +2 -2
  324. package/Microsoft.ReactNative/Modules/AppearanceModule.h +1 -1
  325. package/Microsoft.ReactNative/Modules/DeviceInfoModule.cpp +4 -2
  326. package/Microsoft.ReactNative/Modules/DeviceInfoModule.h +1 -1
  327. package/Microsoft.ReactNative/Modules/I18nManagerModule.cpp +2 -2
  328. package/Microsoft.ReactNative/Modules/I18nManagerModule.h +1 -1
  329. package/Microsoft.ReactNative/Modules/NativeUIManager.cpp +21 -15
  330. package/Microsoft.ReactNative/Modules/PaperUIManagerModule.cpp +10 -6
  331. package/Microsoft.ReactNative/Modules/PaperUIManagerModule.h +4 -1
  332. package/Microsoft.ReactNative/QuirkSettings.idl +1 -1
  333. package/Microsoft.ReactNative/ReactApplication.cpp +13 -11
  334. package/Microsoft.ReactNative/ReactApplication.h +4 -4
  335. package/Microsoft.ReactNative/ReactCoreInjection.h +6 -5
  336. package/Microsoft.ReactNative/ReactHost/JSCallInvokerScheduler.cpp +2 -2
  337. package/Microsoft.ReactNative/ReactHost/MsoUtils.cpp +1 -1
  338. package/Microsoft.ReactNative/ReactHost/React.h +3 -6
  339. package/Microsoft.ReactNative/ReactHost/ReactHost.cpp +0 -16
  340. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +8 -16
  341. package/Microsoft.ReactNative/ReactInstanceSettings.cpp +6 -5
  342. package/Microsoft.ReactNative/ReactInstanceSettings.h +7 -7
  343. package/Microsoft.ReactNative/ReactNativeHost.h +4 -4
  344. package/Microsoft.ReactNative/ReactRootView.cpp +5 -4
  345. package/Microsoft.ReactNative/ReactRootView.h +2 -2
  346. package/Microsoft.ReactNative/ReactSupport.h +1 -1
  347. package/Microsoft.ReactNative/RedBox.cpp +1 -1
  348. package/Microsoft.ReactNative/RedBoxHandler.idl +1 -1
  349. package/Microsoft.ReactNative/Utils/UwpPreparedScriptStore.h +1 -1
  350. package/Microsoft.ReactNative/Utils/ValueUtils.cpp +49 -21
  351. package/Microsoft.ReactNative/Utils/ValueUtils.h +2 -1
  352. package/Microsoft.ReactNative/Views/DynamicAutomationPeer.cpp +31 -59
  353. package/Microsoft.ReactNative/Views/DynamicAutomationPeer.h +3 -4
  354. package/Microsoft.ReactNative/Views/DynamicAutomationProperties.cpp +15 -46
  355. package/Microsoft.ReactNative/Views/DynamicAutomationProperties.h +5 -13
  356. package/Microsoft.ReactNative/Views/FlyoutViewManager.cpp +4 -4
  357. package/Microsoft.ReactNative/Views/FrameworkElementTransferProperties.cpp +2 -8
  358. package/Microsoft.ReactNative/Views/FrameworkElementViewManager.cpp +127 -86
  359. package/Microsoft.ReactNative/Views/ICompositionRootView.h +1 -1
  360. package/Microsoft.ReactNative/Views/Image/ImageViewManager.cpp +1 -1
  361. package/Microsoft.ReactNative/Views/Image/Microsoft.UI.Composition.Effects_Impl.h +2 -2
  362. package/Microsoft.ReactNative/Views/Image/ReactImage.cpp +1 -1
  363. package/Microsoft.ReactNative/Views/SIPEventHandler.cpp +5 -5
  364. package/Microsoft.ReactNative/Views/SIPEventHandler.h +1 -1
  365. package/Microsoft.ReactNative/Views/ShadowNodeBase.h +8 -5
  366. package/Microsoft.ReactNative/Views/SwitchViewManager.cpp +2 -2
  367. package/Microsoft.ReactNative/Views/Text/TextTransformVisitor.cpp +1 -1
  368. package/Microsoft.ReactNative/Views/TextInputViewManager.cpp +32 -14
  369. package/Microsoft.ReactNative/Views/TouchEventHandler.cpp +1 -1
  370. package/Microsoft.ReactNative/Views/ViewManagerBase.cpp +14 -2
  371. package/Microsoft.ReactNative/Views/ViewManagerBase.h +1 -1
  372. package/Microsoft.ReactNative/Views/ViewPanel.cpp +20 -219
  373. package/Microsoft.ReactNative/Views/ViewPanel.h +0 -30
  374. package/Microsoft.ReactNative/Views/ViewViewManager.cpp +17 -158
  375. package/Microsoft.ReactNative/Views/cppwinrt/DynamicAutomationPeer.idl +9 -12
  376. package/Microsoft.ReactNative/Views/cppwinrt/ViewPanel.idl +1 -9
  377. package/Microsoft.ReactNative/XamlHelper.cpp +1 -1
  378. package/Microsoft.ReactNative/XamlHelper.h +1 -1
  379. package/Microsoft.ReactNative/packages.lock.json +128 -0
  380. package/Microsoft.ReactNative.Cxx/JSI/JsiAbiApi.cpp +1 -1
  381. package/Microsoft.ReactNative.Cxx/JSI/JsiAbiApi.h +1 -1
  382. package/Microsoft.ReactNative.Cxx/JSI/JsiApiContext.cpp +2 -2
  383. package/Microsoft.ReactNative.Cxx/JSValue.h +2 -2
  384. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +0 -1
  385. package/Microsoft.ReactNative.Cxx/NativeModules.h +4 -4
  386. package/Microsoft.ReactNative.Cxx/ReactHandleHelper.h +1 -1
  387. package/Microsoft.ReactNative.Cxx/ReactNonAbiValue.h +2 -2
  388. package/Microsoft.ReactNative.Cxx/ReactNotificationService.h +10 -9
  389. package/Microsoft.ReactNative.Cxx/ReactPropertyBag.h +13 -12
  390. package/Microsoft.ReactNative.Managed/JSValueReaderGenerator.cs +5 -5
  391. package/Microsoft.ReactNative.Managed/JSValueWriterGenerator.cs +5 -5
  392. package/Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj +8 -2
  393. package/Microsoft.ReactNative.Managed/ReactPackageBuilderExtensions.cs +1 -1
  394. package/Microsoft.ReactNative.Managed/ReflectionReactPackageProvider.cs +1 -1
  395. package/Microsoft.ReactNative.Managed/packages.lock.json +9 -9
  396. package/Microsoft.ReactNative.Managed.CodeGen/CodeAnalyzer.cs +2 -0
  397. package/Microsoft.ReactNative.Managed.CodeGen/CodeGenerator.Module.cs +4 -2
  398. package/Microsoft.ReactNative.Managed.CodeGen/CodeGenerator.ViewManager.cs +1 -1
  399. package/Microsoft.ReactNative.Managed.CodeGen/DiagnosticDescriptors.cs +1 -1
  400. package/Microsoft.ReactNative.Managed.CodeGen/packages.lock.json +3197 -0
  401. package/Mso/compilerAdapters/compilerFeatures.h +1 -1
  402. package/Mso/compilerAdapters/functionDecorations.h +6 -6
  403. package/Mso/debugAssertApi/debugAssertDetails.h +1 -1
  404. package/Mso/dispatchQueue/dispatchQueue.h +3 -3
  405. package/Mso/motifCpp/motifCppTest.h +1 -1
  406. package/Mso/motifCpp/testCheck.h +1 -1
  407. package/Mso/oacr/oacr.h +1 -1
  408. package/Mso/smartPtr/smartPointerBase.h +1 -1
  409. package/Mso/src/dispatchQueue/looperScheduler.cpp +2 -2
  410. package/Mso/src/dispatchQueue/queueService.cpp +1 -1
  411. package/Mso/src/dispatchQueue/taskQueue.h +1 -1
  412. package/Mso/src/dispatchQueue/threadPoolScheduler_win.cpp +2 -2
  413. package/Mso/src/dispatchQueue/uiScheduler_winrt.cpp +122 -45
  414. package/Mso/src/eventWaitHandle/eventWaitHandleImpl_win.cpp +2 -2
  415. package/Mso/src/future/futureImpl.cpp +5 -5
  416. package/Mso/src/future/futureImpl.h +1 -1
  417. package/PropertySheets/External/Microsoft.ReactNative.Common.props +3 -0
  418. package/PropertySheets/External/{Microsoft.ReactNative.WinAppSDK.Common.props → Microsoft.ReactNative.Composition.Common.props} +2 -2
  419. package/PropertySheets/External/{Microsoft.ReactNative.WinAppSDK.CSharpApp.props → Microsoft.ReactNative.Composition.CppApp.props} +7 -10
  420. package/PropertySheets/External/Microsoft.ReactNative.Composition.CppApp.targets +19 -0
  421. package/PropertySheets/External/Microsoft.ReactNative.Composition.Package.props +14 -0
  422. package/PropertySheets/External/Microsoft.ReactNative.Composition.Package.targets +18 -0
  423. package/PropertySheets/External/Microsoft.ReactNative.WindowsSdk.Default.props +1 -1
  424. package/PropertySheets/Generated/PackageVersion.g.props +4 -4
  425. package/PropertySheets/HybridCRT.props +34 -0
  426. package/PropertySheets/JSEngine.props +1 -2
  427. package/PropertySheets/React.Cpp.props +0 -1
  428. package/PropertySheets/Warnings.props +1 -1
  429. package/PropertySheets/WinUI.props +1 -1
  430. package/ReactCommon/ReactCommon.vcxproj +15 -9
  431. package/ReactCommon/ReactCommon.vcxproj.filters +0 -3
  432. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsi/jsi/test/testlib.cpp +32 -5
  433. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Bridging.h +20 -0
  434. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/YogaLayoutableShadowNode.cpp +1038 -0
  435. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/YogaStylableProps.cpp +228 -38
  436. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/conversions.h +895 -0
  437. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/mounting/ShadowTree.cpp +543 -0
  438. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/uimanager/UIManagerBinding.cpp +1509 -0
  439. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/bits/NumericBitfield.h +67 -0
  440. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/config/Config.h +93 -0
  441. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/LayoutResults.h +88 -0
  442. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/Node.cpp +606 -0
  443. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/Node.h +344 -0
  444. package/ReactCommon/Yoga.cpp +497 -3895
  445. package/ReactCommon/packages.lock.json +30 -0
  446. package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +22 -0
  447. package/Scripts/OfficeReact.Win32.nuspec +1 -0
  448. package/Scripts/rnw-dependencies.ps1 +79 -26
  449. package/Shared/BaseScriptStoreImpl.cpp +42 -13
  450. package/Shared/BaseScriptStoreImpl.h +1 -1
  451. package/Shared/Composition/AutoDraw.h +36 -0
  452. package/Shared/CxxMessageQueue.cpp +1 -1
  453. package/Shared/DevSettings.h +3 -0
  454. package/Shared/DevSupportManager.h +1 -1
  455. package/Shared/Hasher.cpp +64 -0
  456. package/Shared/Hasher.h +24 -0
  457. package/Shared/HermesRuntimeHolder.cpp +6 -6
  458. package/Shared/IDevSupportManager.h +1 -1
  459. package/Shared/JSI/ChakraApi.cpp +1 -1
  460. package/Shared/JSI/ChakraRuntime.cpp +10 -10
  461. package/Shared/JSI/ChakraRuntime.h +6 -6
  462. package/Shared/JSI/V8RuntimeHolder.cpp +1 -1
  463. package/Shared/Modules/IRequestBodyHandler.h +1 -1
  464. package/Shared/Modules/IUriHandler.h +1 -1
  465. package/Shared/Modules/PlatformConstantsModule.cpp +1 -1
  466. package/Shared/Modules/WebSocketModule.cpp +1 -1
  467. package/Shared/Networking/DefaultBlobResource.cpp +2 -2
  468. package/Shared/Networking/OriginPolicyHttpFilter.cpp +22 -16
  469. package/Shared/Networking/OriginPolicyHttpFilter.h +12 -11
  470. package/Shared/OInstance.cpp +9 -23
  471. package/Shared/OInstance.h +1 -1
  472. package/Shared/PackagerConnection.h +1 -1
  473. package/Shared/SafeLoadLibrary.cpp +8 -44
  474. package/Shared/SafeLoadLibrary.h +1 -5
  475. package/Shared/Shared.vcxitems +50 -20
  476. package/Shared/Shared.vcxitems.filters +26 -17
  477. package/Shared/Threading/BatchingQueueThread.cpp +5 -5
  478. package/Shared/Threading/BatchingQueueThread.h +4 -4
  479. package/Shared/TurboModuleManager.cpp +1 -1
  480. package/Shared/Utils.cpp +1 -1
  481. package/Shared/tracing/fbsystrace.h +1 -1
  482. package/codegen/NativeAnimatedModuleSpec.g.h +2 -0
  483. package/codegen/NativeAnimatedTurboModuleSpec.g.h +2 -0
  484. package/codegen/NativeAppStateSpec.g.h +11 -21
  485. package/codegen/NativeDeviceInfoSpec.g.h +4 -14
  486. package/codegen/NativeI18nManagerSpec.g.h +6 -16
  487. package/codegen/NativeIntersectionObserverSpec.g.h +96 -0
  488. package/codegen/NativeMutationObserverSpec.g.h +90 -0
  489. package/codegen/NativePerformanceObserverSpec.g.h +19 -13
  490. package/codegen/NativePerformanceSpec.g.h +6 -23
  491. package/codegen/NativePlatformConstantsAndroidSpec.g.h +22 -30
  492. package/codegen/NativePlatformConstantsIOSSpec.g.h +17 -25
  493. package/codegen/NativePlatformConstantsWinSpec.g.h +14 -22
  494. package/codegen/NativeSampleTurboModuleSpec.g.h +36 -0
  495. package/codegen/NativeSourceCodeSpec.g.h +3 -13
  496. package/codegen/react/components/rnwcore/EventEmitters.cpp +85 -58
  497. package/codegen/react/components/rnwcore/EventEmitters.h +17 -35
  498. package/codegen/react/components/rnwcore/Props.h +16 -17
  499. package/codegen/rnwcoreJSI-generated.cpp +1462 -319
  500. package/codegen/rnwcoreJSI.h +1609 -462
  501. package/fmt/packages.lock.json +13 -0
  502. package/index.windows.js +3 -3
  503. package/{Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.ios.js → jest/ReactNativeInternalFeatureFlagsMock.js} +2 -1
  504. package/jest/__tests__/setup-test.js +18 -0
  505. package/jest/mockModal.js +6 -4
  506. package/jest/setup.js +61 -30
  507. package/just-task.js +1 -0
  508. package/package.json +37 -42
  509. package/template/cs-app/proj/MyApp.csproj +0 -1
  510. package/template/cs-lib/proj/MyLib.csproj +0 -1
  511. package/templates/.clang-format +4 -0
  512. package/templates/cpp-app/metro.config.js +51 -0
  513. package/templates/cpp-app/template.config.js +119 -0
  514. package/templates/cpp-app/windows/ExperimentalFeatures.props +12 -0
  515. package/templates/cpp-app/windows/MyApp/MyApp.cpp +284 -0
  516. package/templates/cpp-app/windows/MyApp/MyApp.h +3 -0
  517. package/templates/cpp-app/windows/MyApp/MyApp.ico +0 -0
  518. package/templates/cpp-app/windows/MyApp/MyApp.rc +0 -0
  519. package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +142 -0
  520. package/templates/cpp-app/windows/MyApp/MyApp.vcxproj.filters +55 -0
  521. package/templates/cpp-app/windows/MyApp/_gitignore +1 -0
  522. package/templates/cpp-app/windows/MyApp/pch.cpp +1 -0
  523. package/templates/cpp-app/windows/MyApp/pch.h +35 -0
  524. package/templates/cpp-app/windows/MyApp/resource.h +18 -0
  525. package/templates/cpp-app/windows/MyApp/small.ico +0 -0
  526. package/templates/cpp-app/windows/MyApp/targetver.h +8 -0
  527. package/templates/cpp-app/windows/MyApp.Package/Images/LockScreenLogo.scale-200.png +0 -0
  528. package/templates/cpp-app/windows/MyApp.Package/Images/SplashScreen.scale-200.png +0 -0
  529. package/templates/cpp-app/windows/MyApp.Package/Images/Square150x150Logo.scale-200.png +0 -0
  530. package/templates/cpp-app/windows/MyApp.Package/Images/Square44x44Logo.scale-200.png +0 -0
  531. package/templates/cpp-app/windows/MyApp.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png +0 -0
  532. package/templates/cpp-app/windows/MyApp.Package/Images/StoreLogo.png +0 -0
  533. package/templates/cpp-app/windows/MyApp.Package/Images/Wide310x150Logo.scale-200.png +0 -0
  534. package/templates/cpp-app/windows/MyApp.Package/MyApp.Package.wapproj +78 -0
  535. package/{template/cs-app-WinAppSDK/MyApp → templates/cpp-app/windows/MyApp.Package}/Package.appxmanifest +9 -8
  536. package/templates/cpp-app/windows/MyApp.sln +176 -0
  537. package/templates/cpp-app/windows/_gitignore +41 -0
  538. package/templates/old/generateWrapper.js +67 -0
  539. package/templates/old/uwp-cpp-app/template.config.js +15 -0
  540. package/templates/old/uwp-cpp-lib/template.config.js +15 -0
  541. package/templates/old/uwp-cs-app/template.config.js +15 -0
  542. package/templates/old/uwp-cs-lib/template.config.js +15 -0
  543. package/types/experimental.d.ts +44 -0
  544. package/types/index.d.ts +2 -1
  545. package/types/modules/Devtools.d.ts +1 -0
  546. package/types/modules/globals.d.ts +16 -1
  547. package/Libraries/Components/View/ViewWindows.d.ts +0 -19
  548. package/Libraries/Components/View/ViewWindows.js +0 -22
  549. package/Libraries/Components/View/ViewWindows.js.map +0 -1
  550. package/Libraries/Components/View/ViewWindowsProps.d.ts +0 -69
  551. package/Libraries/Components/View/ViewWindowsProps.js +0 -8
  552. package/Libraries/Components/View/ViewWindowsProps.js.map +0 -1
  553. package/Libraries/Utilities/AcessibilityMapping.js +0 -154
  554. package/Libraries/Utilities/NativeDevSplitBundleLoader.js +0 -19
  555. package/Libraries/Utilities/useColorScheme.windows.js +0 -26
  556. package/Microsoft.ReactNative/Fabric/platform/react/components/view/windows/WindowsViewProps.cpp +0 -61
  557. package/Microsoft.ReactNative/Fabric/platform/react/components/view/windows/WindowsViewProps.h +0 -34
  558. package/Microsoft.ReactNative/Fabric/platform/react/components/view/windows/primitives.h +0 -42
  559. package/PropertySheets/External/Microsoft.ReactNative.WinAppSDK.CSharp.PackageReferences.props +0 -11
  560. package/PropertySheets/External/Microsoft.ReactNative.WinAppSDK.CSharpApp.targets +0 -51
  561. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/TouchEventEmitter.cpp +0 -237
  562. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/TouchEventEmitter.h +0 -59
  563. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/ViewEventEmitter.cpp +0 -159
  564. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/ViewEventEmitter.h +0 -94
  565. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/ViewProps.cpp +0 -465
  566. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/ViewProps.h +0 -116
  567. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/ViewShadowNode.cpp +0 -98
  568. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/primitives.h +0 -326
  569. package/Scripts/Microsoft.ReactNative.WindowsAppSDK.nuspec +0 -30
  570. package/Shared/V8JSIRuntimeHolder.cpp +0 -71
  571. package/Shared/V8JSIRuntimeHolder.h +0 -56
  572. package/codegen/NativeDevSplitBundleLoaderSpec.g.h +0 -34
  573. package/template/cs-app-WinAppSDK/MyApp/App.xaml +0 -16
  574. package/template/cs-app-WinAppSDK/MyApp/App.xaml.cs +0 -70
  575. package/template/cs-app-WinAppSDK/MyApp/MainWindow.xaml +0 -14
  576. package/template/cs-app-WinAppSDK/MyApp/MainWindow.xaml.cs +0 -38
  577. package/template/cs-app-WinAppSDK/MyApp/Properties/PublishProfiles/win10-arm64.pubxml +0 -19
  578. package/template/cs-app-WinAppSDK/MyApp/Properties/PublishProfiles/win10-x64.pubxml +0 -19
  579. package/template/cs-app-WinAppSDK/MyApp/Properties/PublishProfiles/win10-x86.pubxml +0 -19
  580. package/template/cs-app-WinAppSDK/MyApp/Properties/launchSettings.json +0 -10
  581. package/template/cs-app-WinAppSDK/MyApp/app.manifest +0 -15
  582. package/template/cs-app-WinAppSDK/proj/ExperimentalFeatures.props +0 -24
  583. package/template/cs-app-WinAppSDK/proj/MyApp.csproj +0 -53
  584. package/template/cs-app-WinAppSDK/proj/MyApp.sln +0 -43
  585. package/template/cs-app-WinAppSDK/proj/NuGet_Config +0 -19
  586. /package/Libraries/Components/DrawerAndroid/{DrawerLayoutAndroid.ios.js → DrawerLayoutAndroid.js} +0 -0
  587. /package/Libraries/{Renderer/public → ReactNative/ReactFabricPublicInstance}/ReactFabricPublicInstanceUtils.js +0 -0
@@ -0,0 +1,1509 @@
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 "UIManagerBinding.h"
9
+
10
+ #include <glog/logging.h>
11
+ #include <jsi/JSIDynamic.h>
12
+ #include <react/debug/react_native_assert.h>
13
+ #include <react/renderer/components/view/PointerEvent.h>
14
+ #include <react/renderer/core/LayoutableShadowNode.h>
15
+ #include <react/renderer/core/TraitCast.h>
16
+ #include <react/renderer/debug/SystraceSection.h>
17
+ #include <react/renderer/runtimescheduler/RuntimeSchedulerBinding.h>
18
+ #include <react/renderer/uimanager/primitives.h>
19
+
20
+ #include <utility>
21
+
22
+ #include "bindingUtils.h"
23
+
24
+ namespace facebook::react {
25
+
26
+ void UIManagerBinding::createAndInstallIfNeeded(
27
+ jsi::Runtime& runtime,
28
+ const std::shared_ptr<UIManager>& uiManager) {
29
+ auto uiManagerModuleName = "nativeFabricUIManager";
30
+
31
+ auto uiManagerValue =
32
+ runtime.global().getProperty(runtime, uiManagerModuleName);
33
+ if (uiManagerValue.isUndefined()) {
34
+ // The global namespace does not have an instance of the binding;
35
+ // we need to create, install and return it.
36
+ auto uiManagerBinding = std::make_shared<UIManagerBinding>(uiManager);
37
+ auto object = jsi::Object::createFromHostObject(runtime, uiManagerBinding);
38
+ runtime.global().setProperty(
39
+ runtime, uiManagerModuleName, std::move(object));
40
+ }
41
+ }
42
+
43
+ std::shared_ptr<UIManagerBinding> UIManagerBinding::getBinding(
44
+ jsi::Runtime& runtime) {
45
+ auto uiManagerModuleName = "nativeFabricUIManager";
46
+
47
+ auto uiManagerValue =
48
+ runtime.global().getProperty(runtime, uiManagerModuleName);
49
+ if (uiManagerValue.isUndefined()) {
50
+ return nullptr;
51
+ }
52
+
53
+ auto uiManagerObject = uiManagerValue.asObject(runtime);
54
+ return uiManagerObject.getHostObject<UIManagerBinding>(runtime);
55
+ }
56
+
57
+ UIManagerBinding::UIManagerBinding(std::shared_ptr<UIManager> uiManager)
58
+ : uiManager_(std::move(uiManager)) {}
59
+
60
+ UIManagerBinding::~UIManagerBinding() {
61
+ LOG(WARNING) << "UIManagerBinding::~UIManagerBinding() was called (address: "
62
+ << this << ").";
63
+ }
64
+
65
+ jsi::Value UIManagerBinding::getInspectorDataForInstance(
66
+ jsi::Runtime& runtime,
67
+ const EventEmitter& eventEmitter) const {
68
+ auto eventTarget = eventEmitter.eventTarget_;
69
+ EventEmitter::DispatchMutex().lock();
70
+
71
+ if (!runtime.global().hasProperty(runtime, "__fbBatchedBridge") ||
72
+ !eventTarget) {
73
+ return jsi::Value::undefined();
74
+ }
75
+
76
+ eventTarget->retain(runtime);
77
+ auto instanceHandle = eventTarget->getInstanceHandle(runtime);
78
+ eventTarget->release(runtime);
79
+ EventEmitter::DispatchMutex().unlock();
80
+
81
+ if (instanceHandle.isUndefined()) {
82
+ return jsi::Value::undefined();
83
+ }
84
+
85
+ return callMethodOfModule(
86
+ runtime,
87
+ "ReactFabric",
88
+ "getInspectorDataForInstance",
89
+ {std::move(instanceHandle)});
90
+ }
91
+
92
+ void UIManagerBinding::dispatchEvent(
93
+ jsi::Runtime& runtime,
94
+ const EventTarget* eventTarget,
95
+ const std::string& type,
96
+ ReactEventPriority priority,
97
+ const EventPayload& eventPayload) const {
98
+ SystraceSection s("UIManagerBinding::dispatchEvent", "type", type);
99
+
100
+ if (eventPayload.getType() == EventPayloadType::PointerEvent) {
101
+ auto pointerEvent = static_cast<const PointerEvent&>(eventPayload);
102
+ auto dispatchCallback = [this](
103
+ jsi::Runtime& runtime,
104
+ const EventTarget* eventTarget,
105
+ const std::string& type,
106
+ ReactEventPriority priority,
107
+ const EventPayload& eventPayload) {
108
+ this->dispatchEventToJS(
109
+ runtime, eventTarget, type, priority, eventPayload);
110
+ };
111
+ pointerEventsProcessor_.interceptPointerEvent(
112
+ runtime,
113
+ eventTarget,
114
+ type,
115
+ priority,
116
+ pointerEvent,
117
+ dispatchCallback,
118
+ *uiManager_);
119
+ } else {
120
+ dispatchEventToJS(runtime, eventTarget, type, priority, eventPayload);
121
+ }
122
+ }
123
+
124
+ void UIManagerBinding::dispatchEventToJS(
125
+ jsi::Runtime& runtime,
126
+ const EventTarget* eventTarget,
127
+ const std::string& type,
128
+ ReactEventPriority priority,
129
+ const EventPayload& eventPayload) const {
130
+ auto payload = eventPayload.asJSIValue(runtime);
131
+
132
+ // If a payload is null, the factory has decided to cancel the event
133
+ if (payload.isNull()) {
134
+ return;
135
+ }
136
+
137
+ auto instanceHandle = eventTarget != nullptr
138
+ ? [&]() {
139
+ auto instanceHandle = eventTarget->getInstanceHandle(runtime);
140
+ if (instanceHandle.isUndefined()) {
141
+ return jsi::Value::null();
142
+ }
143
+
144
+ // Mixing `target` into `payload`.
145
+ if (!payload.isObject()) {
146
+ LOG(ERROR) << "payload for dispatchEvent is not an object: " << eventTarget->getTag();
147
+ }
148
+ react_native_assert(payload.isObject());
149
+ payload.asObject(runtime).setProperty(runtime, "target", eventTarget->getTag());
150
+ return instanceHandle;
151
+ }()
152
+ : jsi::Value::null();
153
+
154
+ if (instanceHandle.isNull()) {
155
+ LOG(WARNING) << "instanceHandle is null, event will be dropped";
156
+ }
157
+
158
+ auto& eventHandlerWrapper =
159
+ static_cast<const EventHandlerWrapper&>(*eventHandler_);
160
+
161
+ currentEventPriority_ = priority;
162
+ eventHandlerWrapper.callback.call(
163
+ runtime,
164
+ {std::move(instanceHandle),
165
+ jsi::String::createFromUtf8(runtime, type),
166
+ std::move(payload)});
167
+ currentEventPriority_ = ReactEventPriority::Default;
168
+ }
169
+
170
+ void UIManagerBinding::invalidate() const {
171
+ uiManager_->setDelegate(nullptr);
172
+ }
173
+
174
+ static void validateArgumentCount(
175
+ jsi::Runtime& runtime,
176
+ const std::string& methodName,
177
+ size_t expected,
178
+ size_t actual) {
179
+ if (actual < expected) {
180
+ throw jsi::JSError(
181
+ runtime,
182
+ methodName + " requires " + std::to_string(expected) +
183
+ " arguments, but only " + std::to_string(actual) + " were passed");
184
+ }
185
+ }
186
+
187
+ jsi::Value UIManagerBinding::get(
188
+ jsi::Runtime& runtime,
189
+ const jsi::PropNameID& name) {
190
+ auto methodName = name.utf8(runtime);
191
+ SystraceSection s("UIManagerBinding::get", "name", methodName);
192
+
193
+ // Convert shared_ptr<UIManager> to a raw ptr
194
+ // Why? Because:
195
+ // 1) UIManagerBinding strongly retains UIManager. The JS VM
196
+ // strongly retains UIManagerBinding (through the JSI).
197
+ // These functions are JSI functions and are only called via
198
+ // the JS VM; if the JS VM is torn down, those functions can't
199
+ // execute and these lambdas won't execute.
200
+ // 2) The UIManager is only deallocated when all references to it
201
+ // are deallocated, including the UIManagerBinding. That only
202
+ // happens when the JS VM is deallocated. So, the raw pointer
203
+ // is safe.
204
+ //
205
+ // Even if it's safe, why not just use shared_ptr anyway as
206
+ // extra insurance?
207
+ // 1) Using shared_ptr or weak_ptr when they're not needed is
208
+ // a pessimisation. It's more instructions executed without
209
+ // any additional value in this case.
210
+ // 2) How and when exactly these lambdas is deallocated is
211
+ // complex. Adding shared_ptr to them which causes the UIManager
212
+ // to potentially live longer is unnecessary, complicated cognitive
213
+ // overhead.
214
+ // 3) There is a strong suspicion that retaining UIManager from
215
+ // these C++ lambdas, which are retained by an object that is held onto
216
+ // by the JSI, caused some crashes upon deallocation of the
217
+ // Scheduler and JS VM. This could happen if, for instance, C++
218
+ // semantics cause these lambda to not be deallocated until
219
+ // a CPU tick (or more) after the JS VM is deallocated.
220
+ UIManager* uiManager = uiManager_.get();
221
+
222
+ // Semantic: Creates a new node with given pieces.
223
+ if (methodName == "createNode") {
224
+ auto paramCount = 5;
225
+ return jsi::Function::createFromHostFunction(
226
+ runtime,
227
+ name,
228
+ paramCount,
229
+ [uiManager, methodName, paramCount](
230
+ jsi::Runtime& runtime,
231
+ const jsi::Value& /*thisValue*/,
232
+ const jsi::Value* arguments,
233
+ size_t count) -> jsi::Value {
234
+ validateArgumentCount(runtime, methodName, paramCount, count);
235
+
236
+ auto instanceHandle =
237
+ instanceHandleFromValue(runtime, arguments[4], arguments[0]);
238
+ if (!instanceHandle) {
239
+ react_native_assert(false);
240
+ return jsi::Value::undefined();
241
+ }
242
+
243
+ return valueFromShadowNode(
244
+ runtime,
245
+ uiManager->createNode(
246
+ tagFromValue(arguments[0]),
247
+ stringFromValue(runtime, arguments[1]),
248
+ surfaceIdFromValue(runtime, arguments[2]),
249
+ RawProps(runtime, arguments[3]),
250
+ instanceHandle));
251
+ });
252
+ }
253
+
254
+ // Semantic: Clones the node with *same* props and *same* children.
255
+ if (methodName == "cloneNode") {
256
+ auto paramCount = 1;
257
+ return jsi::Function::createFromHostFunction(
258
+ runtime,
259
+ name,
260
+ paramCount,
261
+ [uiManager, methodName, paramCount](
262
+ jsi::Runtime& runtime,
263
+ const jsi::Value& /*thisValue*/,
264
+ const jsi::Value* arguments,
265
+ size_t count) -> jsi::Value {
266
+ validateArgumentCount(runtime, methodName, paramCount, count);
267
+
268
+ return valueFromShadowNode(
269
+ runtime,
270
+ uiManager->cloneNode(
271
+ *shadowNodeFromValue(runtime, arguments[0])));
272
+ });
273
+ }
274
+
275
+ if (methodName == "setIsJSResponder") {
276
+ auto paramCount = 3;
277
+ return jsi::Function::createFromHostFunction(
278
+ runtime,
279
+ name,
280
+ paramCount,
281
+ [uiManager, methodName, paramCount](
282
+ jsi::Runtime& runtime,
283
+ const jsi::Value& /*thisValue*/,
284
+ const jsi::Value* arguments,
285
+ size_t count) -> jsi::Value {
286
+ validateArgumentCount(runtime, methodName, paramCount, count);
287
+
288
+ uiManager->setIsJSResponder(
289
+ shadowNodeFromValue(runtime, arguments[0]),
290
+ arguments[1].getBool(),
291
+ arguments[2].getBool());
292
+
293
+ return jsi::Value::undefined();
294
+ });
295
+ }
296
+
297
+ if (methodName == "findNodeAtPoint") {
298
+ auto paramCount = 4;
299
+ return jsi::Function::createFromHostFunction(
300
+ runtime,
301
+ name,
302
+ paramCount,
303
+ [uiManager, methodName, paramCount](
304
+ jsi::Runtime& runtime,
305
+ const jsi::Value& /*thisValue*/,
306
+ const jsi::Value* arguments,
307
+ size_t count) {
308
+ validateArgumentCount(runtime, methodName, paramCount, count);
309
+
310
+ auto node = shadowNodeFromValue(runtime, arguments[0]);
311
+ auto locationX = (Float)arguments[1].getNumber();
312
+ auto locationY = (Float)arguments[2].getNumber();
313
+ auto onSuccessFunction =
314
+ arguments[3].getObject(runtime).getFunction(runtime);
315
+ auto targetNode =
316
+ uiManager->findNodeAtPoint(node, Point{locationX, locationY});
317
+ auto& eventTarget = targetNode->getEventEmitter()->eventTarget_;
318
+
319
+ EventEmitter::DispatchMutex().lock();
320
+ eventTarget->retain(runtime);
321
+ auto instanceHandle = eventTarget->getInstanceHandle(runtime);
322
+ eventTarget->release(runtime);
323
+ EventEmitter::DispatchMutex().unlock();
324
+
325
+ onSuccessFunction.call(runtime, std::move(instanceHandle));
326
+ return jsi::Value::undefined();
327
+ });
328
+ }
329
+
330
+ // Semantic: Clones the node with *same* props and *empty* children.
331
+ if (methodName == "cloneNodeWithNewChildren") {
332
+ auto paramCount = 1;
333
+ return jsi::Function::createFromHostFunction(
334
+ runtime,
335
+ name,
336
+ paramCount,
337
+ [uiManager, methodName, paramCount](
338
+ jsi::Runtime& runtime,
339
+ const jsi::Value& /*thisValue*/,
340
+ const jsi::Value* arguments,
341
+ size_t count) -> jsi::Value {
342
+ validateArgumentCount(runtime, methodName, paramCount, count);
343
+
344
+ return valueFromShadowNode(
345
+ runtime,
346
+ uiManager->cloneNode(
347
+ *shadowNodeFromValue(runtime, arguments[0]),
348
+ ShadowNode::emptySharedShadowNodeSharedList()));
349
+ });
350
+ }
351
+
352
+ // Semantic: Clones the node with *given* props and *same* children.
353
+ if (methodName == "cloneNodeWithNewProps") {
354
+ auto paramCount = 2;
355
+ return jsi::Function::createFromHostFunction(
356
+ runtime,
357
+ name,
358
+ paramCount,
359
+ [uiManager, methodName, paramCount](
360
+ jsi::Runtime& runtime,
361
+ const jsi::Value& /*thisValue*/,
362
+ const jsi::Value* arguments,
363
+ size_t count) -> jsi::Value {
364
+ validateArgumentCount(runtime, methodName, paramCount, count);
365
+
366
+ const auto& rawProps = RawProps(runtime, arguments[1]);
367
+ return valueFromShadowNode(
368
+ runtime,
369
+ uiManager->cloneNode(
370
+ *shadowNodeFromValue(runtime, arguments[0]),
371
+ nullptr,
372
+ &rawProps));
373
+ });
374
+ }
375
+
376
+ // Semantic: Clones the node with *given* props and *empty* children.
377
+ if (methodName == "cloneNodeWithNewChildrenAndProps") {
378
+ auto paramCount = 2;
379
+ return jsi::Function::createFromHostFunction(
380
+ runtime,
381
+ name,
382
+ paramCount,
383
+ [uiManager, methodName, paramCount](
384
+ jsi::Runtime& runtime,
385
+ const jsi::Value& /*thisValue*/,
386
+ const jsi::Value* arguments,
387
+ size_t count) -> jsi::Value {
388
+ validateArgumentCount(runtime, methodName, paramCount, count);
389
+
390
+ const auto& rawProps = RawProps(runtime, arguments[1]);
391
+ return valueFromShadowNode(
392
+ runtime,
393
+ uiManager->cloneNode(
394
+ *shadowNodeFromValue(runtime, arguments[0]),
395
+ ShadowNode::emptySharedShadowNodeSharedList(),
396
+ &rawProps));
397
+ });
398
+ }
399
+
400
+ if (methodName == "appendChild") {
401
+ auto paramCount = 2;
402
+ return jsi::Function::createFromHostFunction(
403
+ runtime,
404
+ name,
405
+ paramCount,
406
+ [uiManager, methodName, paramCount](
407
+ jsi::Runtime& runtime,
408
+ const jsi::Value& /*thisValue*/,
409
+ const jsi::Value* arguments,
410
+ size_t count) -> jsi::Value {
411
+ validateArgumentCount(runtime, methodName, paramCount, count);
412
+
413
+ uiManager->appendChild(
414
+ shadowNodeFromValue(runtime, arguments[0]),
415
+ shadowNodeFromValue(runtime, arguments[1]));
416
+ return jsi::Value::undefined();
417
+ });
418
+ }
419
+
420
+ if (methodName == "createChildSet") {
421
+ return jsi::Function::createFromHostFunction(
422
+ runtime,
423
+ name,
424
+ 0,
425
+ [](jsi::Runtime& runtime,
426
+ const jsi::Value& /*thisValue*/,
427
+ const jsi::Value* /*arguments*/,
428
+ size_t /*count*/) -> jsi::Value {
429
+ auto shadowNodeList = std::make_shared<ShadowNode::ListOfShared>(
430
+ ShadowNode::ListOfShared({}));
431
+ return valueFromShadowNodeList(runtime, shadowNodeList);
432
+ });
433
+ }
434
+
435
+ if (methodName == "appendChildToSet") {
436
+ auto paramCount = 2;
437
+ return jsi::Function::createFromHostFunction(
438
+ runtime,
439
+ name,
440
+ paramCount,
441
+ [methodName, paramCount](
442
+ jsi::Runtime& runtime,
443
+ const jsi::Value& /*thisValue*/,
444
+ const jsi::Value* arguments,
445
+ size_t count) -> jsi::Value {
446
+ validateArgumentCount(runtime, methodName, paramCount, count);
447
+
448
+ auto shadowNodeList = shadowNodeListFromValue(runtime, arguments[0]);
449
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[1]);
450
+ shadowNodeList->push_back(shadowNode);
451
+ return jsi::Value::undefined();
452
+ });
453
+ }
454
+
455
+ if (methodName == "completeRoot") {
456
+ auto paramCount = 2;
457
+ std::weak_ptr<UIManager> weakUIManager = uiManager_;
458
+ // Enhanced version of the method that uses `backgroundExecutor` and
459
+ // captures a shared pointer to `UIManager`.
460
+ return jsi::Function::createFromHostFunction(
461
+ runtime,
462
+ name,
463
+ paramCount,
464
+ [weakUIManager, uiManager, methodName, paramCount](
465
+ jsi::Runtime& runtime,
466
+ const jsi::Value& /*thisValue*/,
467
+ const jsi::Value* arguments,
468
+ size_t count) -> jsi::Value {
469
+ validateArgumentCount(runtime, methodName, paramCount, count);
470
+
471
+ auto runtimeSchedulerBinding =
472
+ RuntimeSchedulerBinding::getBinding(runtime);
473
+ auto surfaceId = surfaceIdFromValue(runtime, arguments[0]);
474
+ ShadowTree::CommitOptions options = {/* .enableStateReconciliation = */ true, /* .mountSynchronously = */ false};
475
+
476
+ if (!uiManager->backgroundExecutor_ ||
477
+ (runtimeSchedulerBinding &&
478
+ runtimeSchedulerBinding->getIsSynchronous())) {
479
+ auto weakShadowNodeList =
480
+ weakShadowNodeListFromValue(runtime, arguments[1]);
481
+ auto shadowNodeList =
482
+ shadowNodeListFromWeakList(weakShadowNodeList);
483
+ if (shadowNodeList) {
484
+ uiManager->completeSurface(
485
+ surfaceId,
486
+ shadowNodeList,
487
+ options);
488
+ }
489
+ } else {
490
+ auto weakShadowNodeList =
491
+ weakShadowNodeListFromValue(runtime, arguments[1]);
492
+ static std::atomic_uint_fast8_t completeRootEventCounter{0};
493
+ static std::atomic_uint_fast32_t mostRecentSurfaceId{0};
494
+ completeRootEventCounter += 1;
495
+ mostRecentSurfaceId = surfaceId;
496
+ uiManager->backgroundExecutor_(
497
+ [weakUIManager,
498
+ weakShadowNodeList,
499
+ surfaceId,
500
+ eventCount = completeRootEventCounter.load()] {
501
+ auto shouldYield = [=]() -> bool {
502
+ // If `completeRootEventCounter` was incremented, another
503
+ // `completeSurface` call has been scheduled and current
504
+ // `completeSurface` should yield to it.
505
+ return completeRootEventCounter > eventCount &&
506
+ mostRecentSurfaceId == surfaceId;
507
+ };
508
+ auto shadowNodeList =
509
+ shadowNodeListFromWeakList(weakShadowNodeList);
510
+ auto strongUIManager = weakUIManager.lock();
511
+ ShadowTree::CommitOptions options = {/* .enableStateReconciliation = */ true, /* .mountSynchronously = */ false, /* .shouldYield = */ shouldYield};
512
+ if (shadowNodeList && strongUIManager) {
513
+ strongUIManager->completeSurface(
514
+ surfaceId,
515
+ shadowNodeList,
516
+ options);
517
+ }
518
+ });
519
+ }
520
+
521
+ return jsi::Value::undefined();
522
+ });
523
+ }
524
+
525
+ if (methodName == "registerEventHandler") {
526
+ auto paramCount = 1;
527
+ return jsi::Function::createFromHostFunction(
528
+ runtime,
529
+ name,
530
+ paramCount,
531
+ [this, methodName, paramCount](
532
+ jsi::Runtime& runtime,
533
+ const jsi::Value& /*thisValue*/,
534
+ const jsi::Value* arguments,
535
+ size_t count) -> jsi::Value {
536
+ validateArgumentCount(runtime, methodName, paramCount, count);
537
+
538
+ auto eventHandler =
539
+ arguments[0].getObject(runtime).getFunction(runtime);
540
+ eventHandler_ =
541
+ std::make_unique<EventHandlerWrapper>(std::move(eventHandler));
542
+ return jsi::Value::undefined();
543
+ });
544
+ }
545
+
546
+ if (methodName == "getRelativeLayoutMetrics") {
547
+ auto paramCount = 2;
548
+ return jsi::Function::createFromHostFunction(
549
+ runtime,
550
+ name,
551
+ paramCount,
552
+ [uiManager, methodName, paramCount](
553
+ jsi::Runtime& runtime,
554
+ const jsi::Value& /*thisValue*/,
555
+ const jsi::Value* arguments,
556
+ size_t count) -> jsi::Value {
557
+ validateArgumentCount(runtime, methodName, paramCount, count);
558
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ true};
559
+
560
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
561
+ *shadowNodeFromValue(runtime, arguments[0]),
562
+ shadowNodeFromValue(runtime, arguments[1]).get(),
563
+ policy);
564
+ auto frame = layoutMetrics.frame;
565
+ auto result = jsi::Object(runtime);
566
+ result.setProperty(runtime, "left", frame.origin.x);
567
+ result.setProperty(runtime, "top", frame.origin.y);
568
+ result.setProperty(runtime, "width", frame.size.width);
569
+ result.setProperty(runtime, "height", frame.size.height);
570
+ return result;
571
+ });
572
+ }
573
+
574
+ if (methodName == "dispatchCommand") {
575
+ auto paramCount = 3;
576
+ return jsi::Function::createFromHostFunction(
577
+ runtime,
578
+ name,
579
+ paramCount,
580
+ [uiManager, methodName, paramCount](
581
+ jsi::Runtime& runtime,
582
+ const jsi::Value& /*thisValue*/,
583
+ const jsi::Value* arguments,
584
+ size_t count) -> jsi::Value {
585
+ validateArgumentCount(runtime, methodName, paramCount, count);
586
+
587
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
588
+ if (shadowNode) {
589
+ uiManager->dispatchCommand(
590
+ shadowNode,
591
+ stringFromValue(runtime, arguments[1]),
592
+ commandArgsFromValue(runtime, arguments[2]));
593
+ }
594
+ return jsi::Value::undefined();
595
+ });
596
+ }
597
+
598
+ if (methodName == "setNativeProps") {
599
+ auto paramCount = 2;
600
+ return jsi::Function::createFromHostFunction(
601
+ runtime,
602
+ name,
603
+ paramCount,
604
+ [uiManager, methodName, paramCount](
605
+ jsi::Runtime& runtime,
606
+ const jsi::Value&,
607
+ const jsi::Value* arguments,
608
+ size_t count) -> jsi::Value {
609
+ validateArgumentCount(runtime, methodName, paramCount, count);
610
+
611
+ uiManager->setNativeProps_DEPRECATED(
612
+ shadowNodeFromValue(runtime, arguments[0]),
613
+ RawProps(runtime, arguments[1]));
614
+
615
+ return jsi::Value::undefined();
616
+ });
617
+ }
618
+
619
+ // Legacy API
620
+ if (methodName == "measureLayout") {
621
+ auto paramCount = 4;
622
+ return jsi::Function::createFromHostFunction(
623
+ runtime,
624
+ name,
625
+ paramCount,
626
+ [uiManager, methodName, paramCount](
627
+ jsi::Runtime& runtime,
628
+ const jsi::Value& /*thisValue*/,
629
+ const jsi::Value* arguments,
630
+ size_t count) {
631
+ validateArgumentCount(runtime, methodName, paramCount, count);
632
+
633
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false};
634
+
635
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
636
+ *shadowNodeFromValue(runtime, arguments[0]),
637
+ shadowNodeFromValue(runtime, arguments[1]).get(),
638
+ policy);
639
+
640
+ if (layoutMetrics == EmptyLayoutMetrics) {
641
+ auto onFailFunction =
642
+ arguments[2].getObject(runtime).getFunction(runtime);
643
+ onFailFunction.call(runtime);
644
+ return jsi::Value::undefined();
645
+ }
646
+
647
+ auto onSuccessFunction =
648
+ arguments[3].getObject(runtime).getFunction(runtime);
649
+ auto frame = layoutMetrics.frame;
650
+
651
+ onSuccessFunction.call(
652
+ runtime,
653
+ {jsi::Value{runtime, (double)frame.origin.x},
654
+ jsi::Value{runtime, (double)frame.origin.y},
655
+ jsi::Value{runtime, (double)frame.size.width},
656
+ jsi::Value{runtime, (double)frame.size.height}});
657
+ return jsi::Value::undefined();
658
+ });
659
+ }
660
+
661
+ if (methodName == "measure") {
662
+ auto paramCount = 2;
663
+ return jsi::Function::createFromHostFunction(
664
+ runtime,
665
+ name,
666
+ paramCount,
667
+ [uiManager, methodName, paramCount](
668
+ jsi::Runtime& runtime,
669
+ const jsi::Value& /*thisValue*/,
670
+ const jsi::Value* arguments,
671
+ size_t count) {
672
+ validateArgumentCount(runtime, methodName, paramCount, count);
673
+
674
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false};
675
+
676
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
677
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
678
+ *shadowNode, nullptr, policy);
679
+ auto onSuccessFunction =
680
+ arguments[1].getObject(runtime).getFunction(runtime);
681
+
682
+ if (layoutMetrics == EmptyLayoutMetrics) {
683
+ onSuccessFunction.call(runtime, {0, 0, 0, 0, 0, 0});
684
+ return jsi::Value::undefined();
685
+ }
686
+ auto newestCloneOfShadowNode =
687
+ uiManager->getNewestCloneOfShadowNode(*shadowNode);
688
+
689
+ auto layoutableShadowNode = traitCast<LayoutableShadowNode const*>(
690
+ newestCloneOfShadowNode.get());
691
+ Point originRelativeToParent = layoutableShadowNode != nullptr
692
+ ? layoutableShadowNode->getLayoutMetrics().frame.origin
693
+ : Point();
694
+
695
+ auto frame = layoutMetrics.frame;
696
+ onSuccessFunction.call(
697
+ runtime,
698
+ {jsi::Value{runtime, (double)originRelativeToParent.x},
699
+ jsi::Value{runtime, (double)originRelativeToParent.y},
700
+ jsi::Value{runtime, (double)frame.size.width},
701
+ jsi::Value{runtime, (double)frame.size.height},
702
+ jsi::Value{runtime, (double)frame.origin.x},
703
+ jsi::Value{runtime, (double)frame.origin.y}});
704
+ return jsi::Value::undefined();
705
+ });
706
+ }
707
+
708
+ if (methodName == "measureInWindow") {
709
+ auto paramCount = 2;
710
+ return jsi::Function::createFromHostFunction(
711
+ runtime,
712
+ name,
713
+ paramCount,
714
+ [uiManager, methodName, paramCount](
715
+ jsi::Runtime& runtime,
716
+ const jsi::Value& /*thisValue*/,
717
+ const jsi::Value* arguments,
718
+ size_t count) {
719
+ validateArgumentCount(runtime, methodName, paramCount, count);
720
+
721
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false, /* .includeViewportOffset = */ true};
722
+
723
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
724
+ *shadowNodeFromValue(runtime, arguments[0]),
725
+ nullptr,
726
+ policy);
727
+
728
+ auto onSuccessFunction =
729
+ arguments[1].getObject(runtime).getFunction(runtime);
730
+
731
+ if (layoutMetrics == EmptyLayoutMetrics) {
732
+ onSuccessFunction.call(runtime, {0, 0, 0, 0});
733
+ return jsi::Value::undefined();
734
+ }
735
+
736
+ auto frame = layoutMetrics.frame;
737
+ onSuccessFunction.call(
738
+ runtime,
739
+ {jsi::Value{runtime, (double)frame.origin.x},
740
+ jsi::Value{runtime, (double)frame.origin.y},
741
+ jsi::Value{runtime, (double)frame.size.width},
742
+ jsi::Value{runtime, (double)frame.size.height}});
743
+ return jsi::Value::undefined();
744
+ });
745
+ }
746
+
747
+ if (methodName == "sendAccessibilityEvent") {
748
+ auto paramCount = 2;
749
+ return jsi::Function::createFromHostFunction(
750
+ runtime,
751
+ name,
752
+ paramCount,
753
+ [uiManager, methodName, paramCount](
754
+ jsi::Runtime& runtime,
755
+ const jsi::Value& /*thisValue*/,
756
+ const jsi::Value* arguments,
757
+ size_t count) -> jsi::Value {
758
+ validateArgumentCount(runtime, methodName, paramCount, count);
759
+
760
+ uiManager->sendAccessibilityEvent(
761
+ shadowNodeFromValue(runtime, arguments[0]),
762
+ stringFromValue(runtime, arguments[1]));
763
+
764
+ return jsi::Value::undefined();
765
+ });
766
+ }
767
+
768
+ if (methodName == "configureNextLayoutAnimation") {
769
+ auto paramCount = 3;
770
+ return jsi::Function::createFromHostFunction(
771
+ runtime,
772
+ name,
773
+ paramCount,
774
+ [uiManager, methodName, paramCount](
775
+ jsi::Runtime& runtime,
776
+ const jsi::Value& /*thisValue*/,
777
+ const jsi::Value* arguments,
778
+ size_t count) -> jsi::Value {
779
+ validateArgumentCount(runtime, methodName, paramCount, count);
780
+
781
+ uiManager->configureNextLayoutAnimation(
782
+ runtime,
783
+ // TODO: pass in JSI value instead of folly::dynamic to RawValue
784
+ RawValue(commandArgsFromValue(runtime, arguments[0])),
785
+ arguments[1],
786
+ arguments[2]);
787
+ return jsi::Value::undefined();
788
+ });
789
+ }
790
+
791
+ if (methodName == "unstable_getCurrentEventPriority") {
792
+ return jsi::Function::createFromHostFunction(
793
+ runtime,
794
+ name,
795
+ 0,
796
+ [this](
797
+ jsi::Runtime& /*runtime*/,
798
+ const jsi::Value& /*thisValue*/,
799
+ const jsi::Value* /*arguments*/,
800
+ size_t /*count*/) -> jsi::Value {
801
+ return {serialize(currentEventPriority_)};
802
+ });
803
+ }
804
+
805
+ if (methodName == "unstable_DefaultEventPriority") {
806
+ return {serialize(ReactEventPriority::Default)};
807
+ }
808
+
809
+ if (methodName == "unstable_DiscreteEventPriority") {
810
+ return {serialize(ReactEventPriority::Discrete)};
811
+ }
812
+
813
+ if (methodName == "findShadowNodeByTag_DEPRECATED") {
814
+ auto paramCount = 1;
815
+ return jsi::Function::createFromHostFunction(
816
+ runtime,
817
+ name,
818
+ paramCount,
819
+ [uiManager, methodName, paramCount](
820
+ jsi::Runtime& runtime,
821
+ const jsi::Value&,
822
+ const jsi::Value* arguments,
823
+ size_t count) -> jsi::Value {
824
+ validateArgumentCount(runtime, methodName, paramCount, count);
825
+
826
+ auto shadowNode = uiManager->findShadowNodeByTag_DEPRECATED(
827
+ tagFromValue(arguments[0]));
828
+
829
+ if (!shadowNode) {
830
+ return jsi::Value::null();
831
+ }
832
+
833
+ return valueFromShadowNode(runtime, shadowNode);
834
+ });
835
+ }
836
+
837
+ /**
838
+ * DOM traversal and layout APIs
839
+ */
840
+
841
+ if (methodName == "getBoundingClientRect") {
842
+ // This is a React Native implementation of
843
+ // `Element.prototype.getBoundingClientRect` (see
844
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect).
845
+
846
+ // This is similar to `measureInWindow`, except it's explicitly synchronous
847
+ // (returns the result instead of passing it to a callback).
848
+
849
+ // It allows indicating whether to include transforms so it can also be used
850
+ // to implement methods like
851
+ // [`offsetWidth`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth)
852
+ // and
853
+ // [`offsetHeight`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight).
854
+
855
+ // getBoundingClientRect(shadowNode: ShadowNode, includeTransform: boolean):
856
+ // [
857
+ // /* x: */ number,
858
+ // /* y: */ number,
859
+ // /* width: */ number,
860
+ // /* height: */ number
861
+ // ]
862
+ auto paramCount = 2;
863
+ return jsi::Function::createFromHostFunction(
864
+ runtime,
865
+ name,
866
+ paramCount,
867
+ [uiManager, methodName, paramCount](
868
+ jsi::Runtime& runtime,
869
+ const jsi::Value& /*thisValue*/,
870
+ const jsi::Value* arguments,
871
+ size_t count) -> jsi::Value {
872
+ validateArgumentCount(runtime, methodName, paramCount, count);
873
+
874
+ bool includeTransform = arguments[1].getBool();
875
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ includeTransform, /* .includeViewportOffset = */ true};
876
+
877
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
878
+ *shadowNodeFromValue(runtime, arguments[0]),
879
+ nullptr,
880
+ policy);
881
+
882
+ if (layoutMetrics == EmptyLayoutMetrics) {
883
+ return jsi::Value::undefined();
884
+ }
885
+
886
+ auto frame = layoutMetrics.frame;
887
+ return jsi::Array::createWithElements(
888
+ runtime,
889
+ jsi::Value{runtime, (double)frame.origin.x},
890
+ jsi::Value{runtime, (double)frame.origin.y},
891
+ jsi::Value{runtime, (double)frame.size.width},
892
+ jsi::Value{runtime, (double)frame.size.height});
893
+ });
894
+ }
895
+
896
+ if (methodName == "getParentNode") {
897
+ // This is a React Native implementation of `Node.prototype.parentNode`
898
+ // (see https://developer.mozilla.org/en-US/docs/Web/API/Node/parentNode).
899
+
900
+ // If a version of the given shadow node is present in the current revision
901
+ // of an active shadow tree, it returns the instance handle of its parent.
902
+ // Otherwise, it returns null.
903
+
904
+ // getParent(shadowNode: ShadowNode): ?InstanceHandle
905
+ auto paramCount = 1;
906
+ return jsi::Function::createFromHostFunction(
907
+ runtime,
908
+ name,
909
+ paramCount,
910
+ [uiManager, methodName, paramCount](
911
+ jsi::Runtime& runtime,
912
+ const jsi::Value& /*thisValue*/,
913
+ const jsi::Value* arguments,
914
+ size_t count) -> jsi::Value {
915
+ validateArgumentCount(runtime, methodName, paramCount, count);
916
+
917
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
918
+ auto parentShadowNode =
919
+ uiManager->getNewestParentOfShadowNode(*shadowNode);
920
+
921
+ // shadowNode is a RootShadowNode
922
+ if (!parentShadowNode) {
923
+ return jsi::Value::null();
924
+ }
925
+
926
+ return (*parentShadowNode).getInstanceHandle(runtime);
927
+ });
928
+ }
929
+
930
+ if (methodName == "getChildNodes") {
931
+ // This is a React Native implementation of `Node.prototype.childNodes`
932
+ // (see https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes).
933
+
934
+ // If a version of the given shadow node is present in the current revision
935
+ // of an active shadow tree, it returns an array of instance handles of its
936
+ // children. Otherwise, it returns an empty array.
937
+
938
+ // getChildren(shadowNode: ShadowNode): Array<InstanceHandle>
939
+ auto paramCount = 1;
940
+ return jsi::Function::createFromHostFunction(
941
+ runtime,
942
+ name,
943
+ paramCount,
944
+ [uiManager, methodName, paramCount](
945
+ jsi::Runtime& runtime,
946
+ const jsi::Value& /*thisValue*/,
947
+ const jsi::Value* arguments,
948
+ size_t count) -> jsi::Value {
949
+ validateArgumentCount(runtime, methodName, paramCount, count);
950
+
951
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
952
+
953
+ auto newestCloneOfShadowNode =
954
+ uiManager->getNewestCloneOfShadowNode(*shadowNode);
955
+
956
+ // There's no version of this node in the current shadow tree
957
+ if (newestCloneOfShadowNode == nullptr) {
958
+ return jsi::Array(runtime, 0);
959
+ }
960
+
961
+ auto childShadowNodes = newestCloneOfShadowNode->getChildren();
962
+ return getArrayOfInstanceHandlesFromShadowNodes(
963
+ childShadowNodes, runtime);
964
+ });
965
+ }
966
+
967
+ if (methodName == "isConnected") {
968
+ // This is a React Native implementation of `Node.prototype.isConnected`
969
+ // (see https://developer.mozilla.org/en-US/docs/Web/API/Node/isConnected).
970
+
971
+ // Indicates whether a version of the given shadow node is present in
972
+ // the current revision of an active shadow tree.
973
+
974
+ // isConnected(shadowNode: ShadowNode): boolean
975
+ auto paramCount = 1;
976
+ return jsi::Function::createFromHostFunction(
977
+ runtime,
978
+ name,
979
+ paramCount,
980
+ [uiManager, methodName, paramCount](
981
+ jsi::Runtime& runtime,
982
+ const jsi::Value& /*thisValue*/,
983
+ const jsi::Value* arguments,
984
+ size_t count) -> jsi::Value {
985
+ validateArgumentCount(runtime, methodName, paramCount, count);
986
+
987
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
988
+
989
+ auto newestCloneOfShadowNode =
990
+ uiManager->getNewestCloneOfShadowNode(*shadowNode);
991
+
992
+ return jsi::Value(newestCloneOfShadowNode != nullptr);
993
+ });
994
+ }
995
+
996
+ if (methodName == "compareDocumentPosition") {
997
+ // This is a React Native implementation of
998
+ // `Node.prototype.compareDocumentPosition` (see
999
+ // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition).
1000
+
1001
+ // It uses the version of the shadow nodes that are present in the current
1002
+ // revision of the shadow tree (if any). If any of the nodes is not present,
1003
+ // it just indicates they are disconnected.
1004
+
1005
+ // compareDocumentPosition(shadowNode: ShadowNode, otherShadowNode:
1006
+ // ShadowNode): number
1007
+ auto paramCount = 2;
1008
+ return jsi::Function::createFromHostFunction(
1009
+ runtime,
1010
+ name,
1011
+ paramCount,
1012
+ [uiManager, methodName, paramCount](
1013
+ jsi::Runtime& runtime,
1014
+ const jsi::Value& /*thisValue*/,
1015
+ const jsi::Value* arguments,
1016
+ size_t count) -> jsi::Value {
1017
+ validateArgumentCount(runtime, methodName, paramCount, count);
1018
+
1019
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1020
+ auto otherShadowNode = shadowNodeFromValue(runtime, arguments[1]);
1021
+
1022
+ auto documentPosition =
1023
+ uiManager->compareDocumentPosition(*shadowNode, *otherShadowNode);
1024
+
1025
+ return jsi::Value(documentPosition);
1026
+ });
1027
+ }
1028
+
1029
+ if (methodName == "getTextContent") {
1030
+ // This is a React Native implementation of
1031
+ // `Element.prototype.textContent` (see
1032
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/textContent).
1033
+
1034
+ // It uses the version of the shadow node that is present in the current
1035
+ // revision of the shadow tree.
1036
+ // If the version is present, is traverses all its children in DFS and
1037
+ // concatenates all the text contents. Otherwise, it returns an empty
1038
+ // string.
1039
+
1040
+ // This is also used to access the text content of text nodes, which does
1041
+ // not need any traversal.
1042
+
1043
+ // getTextContent(shadowNode: ShadowNode): string
1044
+ auto paramCount = 1;
1045
+ return jsi::Function::createFromHostFunction(
1046
+ runtime,
1047
+ name,
1048
+ paramCount,
1049
+ [uiManager, methodName, paramCount](
1050
+ jsi::Runtime& runtime,
1051
+ const jsi::Value& /*thisValue*/,
1052
+ const jsi::Value* arguments,
1053
+ size_t count) -> jsi::Value {
1054
+ validateArgumentCount(runtime, methodName, paramCount, count);
1055
+
1056
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1057
+
1058
+ auto textContent =
1059
+ uiManager->getTextContentInNewestCloneOfShadowNode(*shadowNode);
1060
+
1061
+ return jsi::Value(
1062
+ runtime, jsi::String::createFromUtf8(runtime, textContent));
1063
+ });
1064
+ }
1065
+
1066
+ if (methodName == "getOffset") {
1067
+ // This is a method to access the offset information for a shadow node, to
1068
+ // implement these methods:
1069
+ // * `HTMLElement.prototype.offsetParent`: see
1070
+ // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent.
1071
+ // * `HTMLElement.prototype.offsetTop`: see
1072
+ // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetTop.
1073
+ // * `HTMLElement.prototype.offsetLeft`: see
1074
+ // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetLeft.
1075
+
1076
+ // It uses the version of the shadow node that is present in the current
1077
+ // revision of the shadow tree. If the node is not present or is not
1078
+ // displayed (because any of its ancestors or itself have 'display: none'),
1079
+ // it returns undefined. Otherwise, it returns its parent (as all nodes in
1080
+ // React Native are currently "positioned") and its offset relative to its
1081
+ // parent.
1082
+
1083
+ // getOffset(shadowNode: ShadowNode):
1084
+ // ?[
1085
+ // /* parent: */ InstanceHandle,
1086
+ // /* top: */ number,
1087
+ // /* left: */ number,
1088
+ // ]
1089
+ auto paramCount = 1;
1090
+ return jsi::Function::createFromHostFunction(
1091
+ runtime,
1092
+ name,
1093
+ paramCount,
1094
+ [uiManager, methodName, paramCount](
1095
+ jsi::Runtime& runtime,
1096
+ const jsi::Value& /*thisValue*/,
1097
+ const jsi::Value* arguments,
1098
+ size_t count) -> jsi::Value {
1099
+ validateArgumentCount(runtime, methodName, paramCount, count);
1100
+
1101
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1102
+
1103
+ auto newestCloneOfShadowNode =
1104
+ uiManager->getNewestCloneOfShadowNode(*shadowNode);
1105
+ auto newestParentOfShadowNode =
1106
+ uiManager->getNewestParentOfShadowNode(*shadowNode);
1107
+ // The node is no longer part of an active shadow tree, or it is the
1108
+ // root node
1109
+ if (newestCloneOfShadowNode == nullptr ||
1110
+ newestParentOfShadowNode == nullptr) {
1111
+ return jsi::Value::undefined();
1112
+ }
1113
+
1114
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false};
1115
+
1116
+ // If the node is not displayed (itself or any of its ancestors has
1117
+ // "display: none"), this returns an empty layout metrics object.
1118
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
1119
+ *shadowNode, nullptr, policy);
1120
+
1121
+ if (layoutMetrics == EmptyLayoutMetrics) {
1122
+ return jsi::Value::undefined();
1123
+ }
1124
+
1125
+ auto layoutableShadowNode = traitCast<LayoutableShadowNode const*>(
1126
+ newestCloneOfShadowNode.get());
1127
+ // This should never happen
1128
+ if (layoutableShadowNode == nullptr) {
1129
+ return jsi::Value::undefined();
1130
+ }
1131
+
1132
+ auto layoutableParentShadowNode =
1133
+ traitCast<LayoutableShadowNode const*>(
1134
+ newestParentOfShadowNode.get());
1135
+ // This should never happen
1136
+ if (layoutableParentShadowNode == nullptr) {
1137
+ return jsi::Value::undefined();
1138
+ }
1139
+
1140
+ auto originRelativeToParentOuterBorder =
1141
+ layoutableShadowNode->getLayoutMetrics().frame.origin;
1142
+
1143
+ // On the Web, offsets are computed from the inner border of the
1144
+ // parent.
1145
+ auto offsetTop = originRelativeToParentOuterBorder.y -
1146
+ layoutableParentShadowNode->getLayoutMetrics().borderWidth.top;
1147
+ auto offsetLeft = originRelativeToParentOuterBorder.x -
1148
+ layoutableParentShadowNode->getLayoutMetrics().borderWidth.left;
1149
+
1150
+ return jsi::Array::createWithElements(
1151
+ runtime,
1152
+ (*newestParentOfShadowNode).getInstanceHandle(runtime),
1153
+ jsi::Value{runtime, (double)offsetTop},
1154
+ jsi::Value{runtime, (double)offsetLeft});
1155
+ });
1156
+ }
1157
+
1158
+ if (methodName == "getScrollPosition") {
1159
+ // This is a method to access scroll information for a shadow node, to
1160
+ // implement these methods:
1161
+ // * `Element.prototype.scrollLeft`: see
1162
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft.
1163
+ // * `Element.prototype.scrollTop`: see
1164
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTop.
1165
+
1166
+ // It uses the version of the shadow node that is present in the current
1167
+ // revision of the shadow tree. If the node is not present or is not
1168
+ // displayed (because any of its ancestors or itself have 'display: none'),
1169
+ // it returns undefined. Otherwise, it returns the scroll position.
1170
+
1171
+ // getScrollPosition(shadowNode: ShadowNode):
1172
+ // ?[
1173
+ // /* scrollLeft: */ number,
1174
+ // /* scrollTop: */ number,
1175
+ // ]
1176
+ auto paramCount = 1;
1177
+ return jsi::Function::createFromHostFunction(
1178
+ runtime,
1179
+ name,
1180
+ paramCount,
1181
+ [uiManager, methodName, paramCount](
1182
+ jsi::Runtime& runtime,
1183
+ const jsi::Value& /*thisValue*/,
1184
+ const jsi::Value* arguments,
1185
+ size_t count) -> jsi::Value {
1186
+ validateArgumentCount(runtime, methodName, paramCount, count);
1187
+
1188
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1189
+
1190
+ auto newestCloneOfShadowNode =
1191
+ uiManager->getNewestCloneOfShadowNode(*shadowNode);
1192
+ // The node is no longer part of an active shadow tree, or it is the
1193
+ // root node
1194
+ if (newestCloneOfShadowNode == nullptr) {
1195
+ return jsi::Value::undefined();
1196
+ }
1197
+
1198
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false};
1199
+
1200
+ // If the node is not displayed (itself or any of its ancestors has
1201
+ // "display: none"), this returns an empty layout metrics object.
1202
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
1203
+ *shadowNode, nullptr, policy);
1204
+
1205
+ if (layoutMetrics == EmptyLayoutMetrics) {
1206
+ return jsi::Value::undefined();
1207
+ }
1208
+
1209
+ auto layoutableShadowNode = traitCast<LayoutableShadowNode const*>(
1210
+ newestCloneOfShadowNode.get());
1211
+ // This should never happen
1212
+ if (layoutableShadowNode == nullptr) {
1213
+ return jsi::Value::undefined();
1214
+ }
1215
+
1216
+ auto scrollPosition = layoutableShadowNode->getContentOriginOffset();
1217
+
1218
+ return jsi::Array::createWithElements(
1219
+ runtime,
1220
+ jsi::Value{
1221
+ runtime,
1222
+ scrollPosition.x == 0 ? 0 : (double)-scrollPosition.x},
1223
+ jsi::Value{
1224
+ runtime,
1225
+ scrollPosition.y == 0 ? 0 : (double)-scrollPosition.y});
1226
+ });
1227
+ }
1228
+
1229
+ if (methodName == "getScrollSize") {
1230
+ // This is a method to access the scroll information of a shadow node, to
1231
+ // implement these methods:
1232
+ // * `Element.prototype.scrollWidth`: see
1233
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollWidth.
1234
+ // * `Element.prototype.scrollHeight`: see
1235
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight.
1236
+
1237
+ // It uses the version of the shadow node that is present in the current
1238
+ // revision of the shadow tree. If the node is not present or is not
1239
+ // displayed (because any of its ancestors or itself have 'display: none'),
1240
+ // it returns undefined. Otherwise, it returns the scroll size.
1241
+
1242
+ // getScrollSize(shadowNode: ShadowNode):
1243
+ // ?[
1244
+ // /* scrollWidth: */ number,
1245
+ // /* scrollHeight: */ number,
1246
+ // ]
1247
+ auto paramCount = 1;
1248
+ return jsi::Function::createFromHostFunction(
1249
+ runtime,
1250
+ name,
1251
+ paramCount,
1252
+ [uiManager, methodName, paramCount](
1253
+ jsi::Runtime& runtime,
1254
+ const jsi::Value& /*thisValue*/,
1255
+ const jsi::Value* arguments,
1256
+ size_t count) -> jsi::Value {
1257
+ validateArgumentCount(runtime, methodName, paramCount, count);
1258
+
1259
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1260
+
1261
+ auto newestCloneOfShadowNode =
1262
+ uiManager->getNewestCloneOfShadowNode(*shadowNode);
1263
+ // The node is no longer part of an active shadow tree, or it is the
1264
+ // root node
1265
+ if (newestCloneOfShadowNode == nullptr) {
1266
+ return jsi::Value::undefined();
1267
+ }
1268
+
1269
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false};
1270
+
1271
+ // If the node is not displayed (itself or any of its ancestors has
1272
+ // "display: none"), this returns an empty layout metrics object.
1273
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
1274
+ *shadowNode, nullptr, policy);
1275
+
1276
+ if (layoutMetrics == EmptyLayoutMetrics ||
1277
+ layoutMetrics.displayType == DisplayType::Inline) {
1278
+ return jsi::Value::undefined();
1279
+ }
1280
+
1281
+ auto layoutableShadowNode =
1282
+ traitCast<YogaLayoutableShadowNode const*>(
1283
+ newestCloneOfShadowNode.get());
1284
+ // This should never happen
1285
+ if (layoutableShadowNode == nullptr) {
1286
+ return jsi::Value::undefined();
1287
+ }
1288
+
1289
+ Size scrollSize = getScrollSize(
1290
+ layoutMetrics, layoutableShadowNode->getContentBounds());
1291
+
1292
+ return jsi::Array::createWithElements(
1293
+ runtime,
1294
+ jsi::Value{runtime, std::round(scrollSize.width)},
1295
+ jsi::Value{runtime, std::round(scrollSize.height)});
1296
+ });
1297
+ }
1298
+
1299
+ if (methodName == "getInnerSize") {
1300
+ // This is a method to access the inner size of a shadow node, to implement
1301
+ // these methods:
1302
+ // * `Element.prototype.clientWidth`: see
1303
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth.
1304
+ // * `Element.prototype.clientHeight`: see
1305
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/clientHeight.
1306
+
1307
+ // It uses the version of the shadow node that is present in the current
1308
+ // revision of the shadow tree. If the node is not present, it is not
1309
+ // displayed (because any of its ancestors or itself have 'display: none'),
1310
+ // or it has an inline display, it returns undefined.
1311
+ // Otherwise, it returns its inner size.
1312
+
1313
+ // getInnerSize(shadowNode: ShadowNode):
1314
+ // ?[
1315
+ // /* width: */ number,
1316
+ // /* height: */ number,
1317
+ // ]
1318
+ auto paramCount = 1;
1319
+ return jsi::Function::createFromHostFunction(
1320
+ runtime,
1321
+ name,
1322
+ paramCount,
1323
+ [uiManager, methodName, paramCount](
1324
+ jsi::Runtime& runtime,
1325
+ const jsi::Value& /*thisValue*/,
1326
+ const jsi::Value* arguments,
1327
+ size_t count) -> jsi::Value {
1328
+ validateArgumentCount(runtime, methodName, paramCount, count);
1329
+
1330
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1331
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false};
1332
+ // If the node is not displayed (itself or any of its ancestors has
1333
+ // "display: none"), this returns an empty layout metrics object.
1334
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
1335
+ *shadowNode, nullptr, policy);
1336
+
1337
+ if (layoutMetrics == EmptyLayoutMetrics ||
1338
+ layoutMetrics.displayType == DisplayType::Inline) {
1339
+ return jsi::Value::undefined();
1340
+ }
1341
+
1342
+ auto paddingFrame = layoutMetrics.getPaddingFrame();
1343
+
1344
+ return jsi::Array::createWithElements(
1345
+ runtime,
1346
+ jsi::Value{runtime, std::round(paddingFrame.size.width)},
1347
+ jsi::Value{runtime, std::round(paddingFrame.size.height)});
1348
+ });
1349
+ }
1350
+
1351
+ if (methodName == "getBorderSize") {
1352
+ // This is a method to access the border size of a shadow node, to implement
1353
+ // these methods:
1354
+ // * `Element.prototype.clientLeft`: see
1355
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/clientLeft.
1356
+ // * `Element.prototype.clientTop`: see
1357
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/clientTop.
1358
+
1359
+ // It uses the version of the shadow node that is present in the current
1360
+ // revision of the shadow tree. If the node is not present, it is not
1361
+ // displayed (because any of its ancestors or itself have 'display: none'),
1362
+ // or it has an inline display, it returns undefined.
1363
+ // Otherwise, it returns its border size.
1364
+
1365
+ // getBorderSize(shadowNode: ShadowNode):
1366
+ // ?[
1367
+ // /* topWidth: */ number,
1368
+ // /* rightWidth: */ number,
1369
+ // /* bottomWidth: */ number,
1370
+ // /* leftWidth: */ number,
1371
+ // ]
1372
+ auto paramCount = 1;
1373
+ return jsi::Function::createFromHostFunction(
1374
+ runtime,
1375
+ name,
1376
+ paramCount,
1377
+ [uiManager, methodName, paramCount](
1378
+ jsi::Runtime& runtime,
1379
+ const jsi::Value& /*thisValue*/,
1380
+ const jsi::Value* arguments,
1381
+ size_t count) -> jsi::Value {
1382
+ validateArgumentCount(runtime, methodName, paramCount, count);
1383
+
1384
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1385
+ LayoutableShadowNode::LayoutInspectingPolicy policy = {/* .includeTransform = */ false};
1386
+ // If the node is not displayed (itself or any of its ancestors has
1387
+ // "display: none"), this returns an empty layout metrics object.
1388
+ auto layoutMetrics = uiManager->getRelativeLayoutMetrics(
1389
+ *shadowNode, nullptr, policy);
1390
+
1391
+ if (layoutMetrics == EmptyLayoutMetrics ||
1392
+ layoutMetrics.displayType == DisplayType::Inline) {
1393
+ return jsi::Value::undefined();
1394
+ }
1395
+
1396
+ return jsi::Array::createWithElements(
1397
+ runtime,
1398
+ jsi::Value{runtime, std::round(layoutMetrics.borderWidth.top)},
1399
+ jsi::Value{runtime, std::round(layoutMetrics.borderWidth.right)},
1400
+ jsi::Value{runtime, std::round(layoutMetrics.borderWidth.bottom)},
1401
+ jsi::Value{runtime, std::round(layoutMetrics.borderWidth.left)});
1402
+ });
1403
+ }
1404
+
1405
+ if (methodName == "getTagName") {
1406
+ // This is a method to access the normalized tag name of a shadow node, to
1407
+ // implement `Element.prototype.tagName` (see
1408
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/tagName).
1409
+
1410
+ // getTagName(shadowNode: ShadowNode): string
1411
+ auto paramCount = 1;
1412
+ return jsi::Function::createFromHostFunction(
1413
+ runtime,
1414
+ name,
1415
+ paramCount,
1416
+ [methodName, paramCount](
1417
+ jsi::Runtime& runtime,
1418
+ const jsi::Value& /*thisValue*/,
1419
+ const jsi::Value* arguments,
1420
+ size_t count) -> jsi::Value {
1421
+ validateArgumentCount(runtime, methodName, paramCount, count);
1422
+
1423
+ auto shadowNode = shadowNodeFromValue(runtime, arguments[0]);
1424
+
1425
+ std::string canonicalComponentName = shadowNode->getComponentName();
1426
+
1427
+ // FIXME(T162807327): Remove Android-specific prefixes and unify
1428
+ // shadow node implementations
1429
+ if (canonicalComponentName == "AndroidTextInput") {
1430
+ canonicalComponentName = "TextInput";
1431
+ } else if (canonicalComponentName == "AndroidSwitch") {
1432
+ canonicalComponentName = "Switch";
1433
+ }
1434
+
1435
+ // Prefix with RN:
1436
+ canonicalComponentName.insert(0, "RN:");
1437
+
1438
+ return jsi::String::createFromUtf8(runtime, canonicalComponentName);
1439
+ });
1440
+ }
1441
+
1442
+ /**
1443
+ * Pointer Capture APIs
1444
+ */
1445
+ if (methodName == "hasPointerCapture") {
1446
+ auto paramCount = 2;
1447
+ return jsi::Function::createFromHostFunction(
1448
+ runtime,
1449
+ name,
1450
+ paramCount,
1451
+ [this, methodName, paramCount](
1452
+ jsi::Runtime& runtime,
1453
+ const jsi::Value& /*thisValue*/,
1454
+ const jsi::Value* arguments,
1455
+ size_t count) -> jsi::Value {
1456
+ validateArgumentCount(runtime, methodName, paramCount, count);
1457
+ bool isCapturing = pointerEventsProcessor_.hasPointerCapture(
1458
+ static_cast<int>(arguments[1].asNumber()),
1459
+ shadowNodeFromValue(runtime, arguments[0]).get());
1460
+ return jsi::Value(isCapturing);
1461
+ });
1462
+ }
1463
+
1464
+ if (methodName == "setPointerCapture") {
1465
+ auto paramCount = 2;
1466
+ return jsi::Function::createFromHostFunction(
1467
+ runtime,
1468
+ name,
1469
+ paramCount,
1470
+ [this, methodName, paramCount](
1471
+ jsi::Runtime& runtime,
1472
+ const jsi::Value& /*thisValue*/,
1473
+ const jsi::Value* arguments,
1474
+ size_t count) -> jsi::Value {
1475
+ validateArgumentCount(runtime, methodName, paramCount, count);
1476
+ pointerEventsProcessor_.setPointerCapture(
1477
+ static_cast<int>(arguments[1].asNumber()),
1478
+ shadowNodeFromValue(runtime, arguments[0]));
1479
+ return jsi::Value::undefined();
1480
+ });
1481
+ }
1482
+
1483
+ if (methodName == "releasePointerCapture") {
1484
+ auto paramCount = 2;
1485
+ return jsi::Function::createFromHostFunction(
1486
+ runtime,
1487
+ name,
1488
+ paramCount,
1489
+ [this, methodName, paramCount](
1490
+ jsi::Runtime& runtime,
1491
+ const jsi::Value& /*thisValue*/,
1492
+ const jsi::Value* arguments,
1493
+ size_t count) -> jsi::Value {
1494
+ validateArgumentCount(runtime, methodName, paramCount, count);
1495
+ pointerEventsProcessor_.releasePointerCapture(
1496
+ static_cast<int>(arguments[1].asNumber()),
1497
+ shadowNodeFromValue(runtime, arguments[0]).get());
1498
+ return jsi::Value::undefined();
1499
+ });
1500
+ }
1501
+
1502
+ return jsi::Value::undefined();
1503
+ }
1504
+
1505
+ UIManager& UIManagerBinding::getUIManager() {
1506
+ return *uiManager_;
1507
+ }
1508
+
1509
+ } // namespace facebook::react