react-native-windows 0.75.4 → 0.76.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/.flowconfig +6 -4
  2. package/Directory.Build.props +4 -0
  3. package/Directory.Build.targets +5 -0
  4. package/Libraries/Alert/Alert.js +3 -0
  5. package/Libraries/Alert/Alert.windows.js +3 -0
  6. package/Libraries/Animated/AnimatedEvent.js +1 -1
  7. package/Libraries/Animated/AnimatedImplementation.js +7 -7
  8. package/Libraries/Animated/NativeAnimatedAllowlist.js +111 -0
  9. package/Libraries/Animated/animations/Animation.js +11 -1
  10. package/Libraries/Animated/animations/DecayAnimation.js +1 -1
  11. package/Libraries/Animated/animations/SpringAnimation.js +1 -1
  12. package/Libraries/Animated/animations/TimingAnimation.js +2 -1
  13. package/Libraries/Animated/components/AnimatedScrollView.js +3 -2
  14. package/Libraries/Animated/createAnimatedComponent.js +10 -9
  15. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  16. package/Libraries/Animated/nodes/AnimatedInterpolation.js +3 -2
  17. package/Libraries/Animated/nodes/AnimatedNode.js +42 -33
  18. package/Libraries/Animated/nodes/AnimatedObject.js +56 -50
  19. package/Libraries/Animated/nodes/AnimatedProps.js +77 -40
  20. package/Libraries/Animated/nodes/AnimatedStyle.js +103 -59
  21. package/Libraries/Animated/nodes/AnimatedTracking.js +1 -1
  22. package/Libraries/Animated/nodes/AnimatedTransform.js +102 -67
  23. package/Libraries/Animated/nodes/AnimatedValue.js +2 -1
  24. package/Libraries/Animated/nodes/AnimatedWithChildren.js +21 -22
  25. package/Libraries/Animated/useAnimatedProps.js +142 -7
  26. package/Libraries/BatchedBridge/NativeModules.js +2 -0
  27. package/Libraries/Blob/FileReader.js +1 -1
  28. package/Libraries/Blob/URL.js +2 -62
  29. package/Libraries/Blob/URLSearchParams.js +71 -0
  30. package/Libraries/Components/Button.windows.js +0 -1
  31. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +1 -1
  32. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +17 -0
  33. package/Libraries/Components/Keyboard/KeyboardExt.js.map +1 -1
  34. package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +1 -1
  35. package/Libraries/Components/ScrollView/ScrollView.js +131 -169
  36. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +3 -0
  37. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.windows.js +3 -0
  38. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +1 -1
  39. package/Libraries/Components/StatusBar/StatusBar.js +3 -1
  40. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +10 -0
  41. package/Libraries/Components/TextInput/TextInput.d.ts +32 -2
  42. package/Libraries/Components/TextInput/TextInput.js +230 -94
  43. package/Libraries/Components/TextInput/TextInput.windows.js +230 -105
  44. package/Libraries/Components/View/ReactNativeStyleAttributes.js +23 -1
  45. package/Libraries/Components/View/ReactNativeViewAttributes.js +2 -0
  46. package/Libraries/Components/View/ReactNativeViewAttributes.windows.js +2 -0
  47. package/Libraries/Components/View/View.windows.js +32 -30
  48. package/Libraries/Components/View/ViewAccessibility.d.ts +15 -0
  49. package/Libraries/Components/View/ViewNativeComponent.js +0 -1
  50. package/Libraries/Components/View/ViewPropTypes.js +14 -0
  51. package/Libraries/Components/View/ViewPropTypes.windows.js +14 -0
  52. package/Libraries/Core/ExceptionsManager.js +2 -0
  53. package/Libraries/Core/InitializeCore.js +3 -1
  54. package/Libraries/Core/ReactFiberErrorDialog.js +3 -0
  55. package/Libraries/Core/ReactNativeVersion.js +4 -4
  56. package/Libraries/Core/setUpDeveloperTools.js +5 -1
  57. package/Libraries/Core/setUpErrorHandling.js +7 -1
  58. package/Libraries/Core/setUpGlobals.js +1 -0
  59. package/Libraries/Core/setUpReactRefresh.js +0 -4
  60. package/Libraries/Image/AssetSourceResolver.js +28 -1
  61. package/Libraries/Image/AssetSourceResolver.windows.js +28 -1
  62. package/Libraries/Image/Image.android.js +9 -14
  63. package/Libraries/Image/Image.ios.js +11 -22
  64. package/Libraries/Image/Image.windows.js +11 -22
  65. package/Libraries/Image/ImageBackground.js +1 -8
  66. package/Libraries/Image/ImageUtils.js +9 -9
  67. package/Libraries/Image/ImageViewNativeComponent.js +1 -0
  68. package/Libraries/Inspector/Inspector.js +3 -2
  69. package/Libraries/Inspector/InspectorPanel.js +16 -10
  70. package/Libraries/Inspector/NetworkOverlay.js +1 -1
  71. package/Libraries/Interaction/TaskQueue.js +1 -0
  72. package/Libraries/Lists/FlatList.js +1 -1
  73. package/Libraries/Lists/SectionList.js +2 -2
  74. package/Libraries/Lists/SectionListModern.js +3 -3
  75. package/Libraries/LogBox/Data/LogBoxData.js +24 -3
  76. package/Libraries/LogBox/LogBoxNotificationContainer.js +3 -2
  77. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +9 -8
  78. package/Libraries/LogBox/UI/LogBoxInspectorHeader.windows.js +9 -8
  79. package/Libraries/Modal/Modal.js +0 -1
  80. package/Libraries/NativeComponent/BaseViewConfig.android.js +9 -1
  81. package/Libraries/NativeComponent/BaseViewConfig.ios.js +17 -1
  82. package/Libraries/NativeComponent/BaseViewConfig.windows.js +17 -1
  83. package/Libraries/NativeComponent/NativeComponentRegistry.js +22 -22
  84. package/Libraries/NativeComponent/StaticViewConfigValidator.js +0 -21
  85. package/Libraries/Network/XMLHttpRequest.js +4 -2
  86. package/Libraries/ReactNative/AppContainer-dev.js +1 -5
  87. package/Libraries/ReactNative/AppContainer-prod.js +1 -5
  88. package/Libraries/ReactNative/AppContainer.js +1 -2
  89. package/Libraries/ReactNative/AppRegistry.d.ts +0 -4
  90. package/Libraries/ReactNative/AppRegistry.js +1 -7
  91. package/Libraries/ReactNative/BridgelessUIManager.js +1 -0
  92. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +1 -1
  93. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance.js +5 -5
  94. package/Libraries/ReactNative/RendererImplementation.js +26 -4
  95. package/Libraries/ReactNative/getNativeComponentAttributes.js +12 -0
  96. package/Libraries/ReactNative/renderApplication.js +1 -3
  97. package/Libraries/Renderer/shims/ReactNativeTypes.js +11 -4
  98. package/Libraries/StyleSheet/StyleSheet.js +1 -1
  99. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +152 -2
  100. package/Libraries/StyleSheet/StyleSheetTypes.js +60 -5
  101. package/Libraries/StyleSheet/processBackgroundImage.js +384 -0
  102. package/Libraries/StyleSheet/processBoxShadow.js +209 -0
  103. package/Libraries/StyleSheet/processFilter.js +231 -42
  104. package/Libraries/Text/Text.js +394 -196
  105. package/Libraries/Text/Text.windows.js +476 -300
  106. package/Libraries/Text/TextNativeComponent.js +2 -1
  107. package/Libraries/TurboModule/TurboModuleRegistry.js +13 -50
  108. package/Libraries/Types/CodegenTypes.js +3 -1
  109. package/Libraries/Utilities/Appearance.js +108 -84
  110. package/Libraries/Utilities/DevLoadingView.js +2 -4
  111. package/Libraries/Utilities/HMRClient.js +8 -6
  112. package/Libraries/Utilities/ReactNativeTestTools.js +1 -1
  113. package/Libraries/Utilities/createPerformanceLogger.js +0 -9
  114. package/Libraries/Utilities/stringifyViewConfig.js +22 -0
  115. package/Libraries/Utilities/useColorScheme.js +3 -3
  116. package/Libraries/WebSocket/WebSocket.js +1 -1
  117. package/Libraries/promiseRejectionTrackingOptions.js +1 -1
  118. package/Libraries/vendor/emitter/EventEmitter.js +6 -5
  119. package/Microsoft.ReactNative/ComponentView.idl +11 -0
  120. package/Microsoft.ReactNative/Composition.Input.idl +1 -0
  121. package/Microsoft.ReactNative/CompositionSwitcher.idl +3 -0
  122. package/Microsoft.ReactNative/Fabric/AbiComponentDescriptor.cpp +9 -9
  123. package/Microsoft.ReactNative/Fabric/AbiViewComponentDescriptor.cpp +9 -9
  124. package/Microsoft.ReactNative/Fabric/ComponentView.cpp +7 -9
  125. package/Microsoft.ReactNative/Fabric/ComponentView.h +5 -6
  126. package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.cpp +4 -0
  127. package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.h +1 -0
  128. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +44 -13
  129. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +42 -5
  130. package/Microsoft.ReactNative/Fabric/Composition/CompositionHwndHost.cpp +1 -0
  131. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +81 -63
  132. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.h +2 -3
  133. package/Microsoft.ReactNative/Fabric/Composition/DebuggingOverlayComponentView.cpp +8 -6
  134. package/Microsoft.ReactNative/Fabric/Composition/DebuggingOverlayComponentView.h +1 -2
  135. package/Microsoft.ReactNative/Fabric/Composition/FocusManager.cpp +20 -6
  136. package/Microsoft.ReactNative/Fabric/Composition/FocusManager.h +13 -6
  137. package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.cpp +2 -3
  138. package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.h +1 -2
  139. package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.cpp +72 -54
  140. package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.h +14 -4
  141. package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.cpp +26 -8
  142. package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.h +5 -2
  143. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +18 -7
  144. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.h +1 -2
  145. package/Microsoft.ReactNative/Fabric/Composition/SwitchComponentView.cpp +6 -6
  146. package/Microsoft.ReactNative/Fabric/Composition/SwitchComponentView.h +1 -2
  147. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +97 -140
  148. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h +8 -4
  149. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.cpp +18 -11
  150. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.h +5 -4
  151. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputState.cpp +0 -13
  152. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputState.h +0 -3
  153. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +29 -4
  154. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +2 -0
  155. package/Microsoft.ReactNative/Fabric/Composition/UnimplementedNativeViewComponentView.cpp +1 -2
  156. package/Microsoft.ReactNative/Fabric/Composition/UnimplementedNativeViewComponentView.h +1 -2
  157. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +28 -12
  158. package/Microsoft.ReactNative/Fabric/platform/react/renderer/graphics/HostPlatformColor.h +33 -0
  159. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/TextLayoutManager.cpp +26 -9
  160. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/TextLayoutManager.h +10 -4
  161. package/Microsoft.ReactNative/IReactModuleBuilder.cpp +5 -0
  162. package/Microsoft.ReactNative/IReactModuleBuilder.h +1 -0
  163. package/Microsoft.ReactNative/IReactModuleBuilder.idl +9 -0
  164. package/Microsoft.ReactNative/IReactViewComponentBuilder.idl +8 -1
  165. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +2 -0
  166. package/Microsoft.ReactNative/Modules/AlertModule.cpp +3 -1
  167. package/Microsoft.ReactNative/Modules/AppearanceModule.cpp +1 -1
  168. package/Microsoft.ReactNative/Modules/AppearanceModule.h +7 -1
  169. package/Microsoft.ReactNative/Modules/DevSettingsModule.cpp +3 -3
  170. package/Microsoft.ReactNative/Modules/DevSettingsModule.h +1 -1
  171. package/Microsoft.ReactNative/Modules/LinkingManagerModule.cpp +2 -2
  172. package/Microsoft.ReactNative/Modules/LinkingManagerModule.h +1 -1
  173. package/Microsoft.ReactNative/Modules/LogBoxModule.cpp +9 -0
  174. package/Microsoft.ReactNative/Modules/LogBoxModule.h +2 -0
  175. package/Microsoft.ReactNative/Modules/SampleTurboModule.cpp +121 -0
  176. package/Microsoft.ReactNative/Modules/SampleTurboModule.h +90 -0
  177. package/Microsoft.ReactNative/ReactHost/MsoReactContext.cpp +0 -7
  178. package/Microsoft.ReactNative/ReactHost/MsoReactContext.h +0 -5
  179. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +5 -1
  180. package/Microsoft.ReactNative/ReactInstanceSettingsBuilder.cpp +59 -0
  181. package/Microsoft.ReactNative/ReactInstanceSettingsBuilder.h +23 -0
  182. package/Microsoft.ReactNative/ReactNativeAppBuilder.cpp +179 -0
  183. package/Microsoft.ReactNative/ReactNativeAppBuilder.h +35 -0
  184. package/Microsoft.ReactNative/ReactNativeAppBuilder.idl +69 -0
  185. package/Microsoft.ReactNative/ReactNativeIsland.idl +2 -0
  186. package/Microsoft.ReactNative/ReactNativeWin32App.cpp +82 -0
  187. package/Microsoft.ReactNative/ReactNativeWin32App.h +38 -0
  188. package/Microsoft.ReactNative/TurboModulesProvider.cpp +45 -0
  189. package/Microsoft.ReactNative/Views/DynamicAutomationPeer.cpp +2 -1
  190. package/Microsoft.ReactNative/Views/FlyoutViewManager.cpp +25 -16
  191. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +3 -4
  192. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems.filters +3 -0
  193. package/Microsoft.ReactNative.Cxx/ModuleRegistration.cpp +2 -2
  194. package/Microsoft.ReactNative.Cxx/ModuleRegistration.h +62 -4
  195. package/Microsoft.ReactNative.Cxx/NativeModules.h +131 -14
  196. package/Microsoft.ReactNative.Managed.CodeGen/ReactNativeNames.cs +10 -2
  197. package/PropertySheets/Autolink.props +1 -1
  198. package/PropertySheets/Bundle.props +1 -1
  199. package/PropertySheets/Codegen.props +1 -1
  200. package/PropertySheets/Generated/PackageVersion.g.props +4 -4
  201. package/PropertySheets/NuGet.LockFile.props +18 -0
  202. package/README.md +29 -29
  203. package/ReactCommon/ReactCommon.vcxproj +5 -1
  204. package/ReactCommon/ReactCommon.vcxproj.filters +11 -2
  205. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/JSExecutor.cpp +2 -7
  206. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsinspector-modern/NetworkIOAgent.cpp +441 -0
  207. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsinspector-modern/NetworkIOAgent.h +266 -0
  208. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsinspector-modern/Utf8.h +56 -0
  209. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Base.h +3 -1
  210. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Bridging.h +2 -2
  211. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/CallbackWrapper.h +1 -1
  212. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Convert.h +172 -0
  213. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/EventEmitter.h +4 -5
  214. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Function.h +2 -2
  215. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModule.h +1 -1
  216. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModuleUtils.h +3 -2
  217. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/scrollview/ScrollViewProps.cpp +9 -0
  218. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/core/LayoutableShadowNode.cpp +363 -0
  219. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/JSRuntimeFactory.h +22 -2
  220. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/ReactInstance.cpp +118 -51
  221. package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +8 -1
  222. package/Scripts/Tfs/Layout-MSRN-Headers.ps1 +2 -2
  223. package/Shared/Modules/WebSocketModule.cpp +1 -2
  224. package/Shared/Networking/WinRTWebSocketResource.cpp +4 -1
  225. package/Shared/Shared.vcxitems +38 -2
  226. package/Shared/Shared.vcxitems.filters +6 -1
  227. package/Shared/TurboModuleManager.cpp +0 -3
  228. package/codegen/NativeLinkingManagerSpec.g.h +3 -3
  229. package/codegen/NativeReactNativeFeatureFlagsSpec.g.h +198 -54
  230. package/codegen/NativeSampleTurboModuleSpec.g.h +35 -0
  231. package/codegen/rnwcoreJSI-generated.cpp +245 -101
  232. package/codegen/rnwcoreJSI.h +847 -548
  233. package/index.js +3 -1
  234. package/index.windows.js +3 -1
  235. package/jest/mockComponent.js +4 -1
  236. package/jest/mockModal.js +1 -3
  237. package/jest/mockScrollView.js +1 -1
  238. package/jest/renderer.js +2 -2
  239. package/jest/setup.js +16 -13
  240. package/package.json +34 -30
  241. package/src/private/animated/NativeAnimatedHelper.js +438 -0
  242. package/src/private/animated/NativeAnimatedValidation.js +64 -0
  243. package/src/private/components/HScrollViewNativeComponents.js +56 -0
  244. package/src/private/components/SafeAreaView_INTERNAL_DO_NOT_USE.js +29 -0
  245. package/src/private/components/VScrollViewNativeComponents.js +48 -0
  246. package/src/private/components/useSyncOnScroll.js +48 -0
  247. package/src/private/featureflags/ReactNativeFeatureFlags.js +166 -16
  248. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +29 -5
  249. package/src/private/fusebox/FuseboxSessionObserver.js +42 -0
  250. package/{Libraries/Core → src/private/renderer/errorhandling}/ErrorHandlers.js +14 -4
  251. package/src/private/setup/setUpDOM.js +28 -0
  252. package/src/private/setup/setUpIntersectionObserver.js +27 -0
  253. package/src/private/setup/setUpMutationObserver.js +26 -0
  254. package/src/private/setup/setUpPerformanceObserver.js +64 -0
  255. package/src/private/specs/modules/NativeAppearance.js +3 -3
  256. package/src/private/specs/modules/NativeLinkingManager.js +1 -1
  257. package/src/private/specs/modules/NativePlatformConstantsWindows.js +7 -0
  258. package/src/private/specs/modules/NativeSampleTurboModule.js +14 -1
  259. package/src/private/webapis/dom/nodes/ReadOnlyNode.js +6 -4
  260. package/{Libraries/IntersectionObserver → src/private/webapis/intersectionobserver}/IntersectionObserver.js +5 -3
  261. package/{Libraries/IntersectionObserver → src/private/webapis/intersectionobserver}/IntersectionObserverEntry.js +3 -3
  262. package/{Libraries/IntersectionObserver → src/private/webapis/intersectionobserver}/IntersectionObserverManager.js +14 -17
  263. package/src/private/{specs/modules → webapis/intersectionobserver/specs}/NativeIntersectionObserver.js +2 -2
  264. package/{Libraries/IntersectionObserver → src/private/webapis/intersectionobserver/specs}/__mocks__/NativeIntersectionObserver.js +4 -4
  265. package/{Libraries/MutationObserver → src/private/webapis/mutationobserver}/MutationObserver.js +5 -3
  266. package/{Libraries/MutationObserver → src/private/webapis/mutationobserver}/MutationObserverManager.js +24 -15
  267. package/{Libraries/MutationObserver → src/private/webapis/mutationobserver}/MutationRecord.js +4 -6
  268. package/src/private/{specs/modules → webapis/mutationobserver/specs}/NativeMutationObserver.js +2 -2
  269. package/{Libraries/MutationObserver → src/private/webapis/mutationobserver/specs}/__mocks__/NativeMutationObserver.js +5 -5
  270. package/src/private/webapis/performance/{EventCounts.js → EventTiming.js} +65 -3
  271. package/src/private/webapis/performance/LongTasks.js +39 -0
  272. package/src/private/webapis/performance/Performance.js +22 -9
  273. package/src/private/webapis/performance/PerformanceEntry.js +36 -18
  274. package/src/private/webapis/performance/PerformanceObserver.js +29 -43
  275. package/src/private/webapis/performance/RawPerformanceEntry.js +24 -1
  276. package/src/private/webapis/performance/UserTiming.js +17 -12
  277. package/src/private/webapis/performance/specs/NativePerformanceObserver.js +1 -1
  278. package/template/cpp-app/src/AutolinkedNativeModules.g.cpp +1 -1
  279. package/template/cpp-app/src/AutolinkedNativeModules.g.h +1 -1
  280. package/template/cs-app/src/AutolinkedNativeModules.g.cs +1 -1
  281. package/template/index.windows.bundle +1 -1
  282. package/template/metro.config.js +2 -2
  283. package/template/shared-app/src/AutolinkedNativeModules.g.props +1 -1
  284. package/template/shared-app/src/AutolinkedNativeModules.g.targets +1 -1
  285. package/templates/cpp-app/metro.config.js +2 -2
  286. package/templates/cpp-app/template.config.js +5 -5
  287. package/templates/cpp-app/windows/MyApp/AutolinkedNativeModules.g.cpp +1 -1
  288. package/templates/cpp-app/windows/MyApp/AutolinkedNativeModules.g.h +1 -1
  289. package/templates/cpp-app/windows/MyApp/MyApp.cpp +2 -0
  290. package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +1 -1
  291. package/templates/cpp-lib/example/metro.config.js +2 -2
  292. package/templates/cpp-lib/template.config.js +3 -3
  293. package/templates/cpp-lib/windows/MyLib/MyLib.h +3 -3
  294. package/templates/cpp-lib/windows/MyLib/MyLib.vcxproj +1 -1
  295. package/types/experimental.d.ts +12 -98
  296. package/Common/packages.lock.json +0 -26
  297. package/Folly/packages.lock.json +0 -23
  298. package/Libraries/Animated/NativeAnimatedHelper.js +0 -615
  299. package/Libraries/Core/setUpIntersectionObserver.js +0 -16
  300. package/Libraries/Core/setUpMutationObserver.js +0 -16
  301. package/Libraries/Core/setUpPerformanceObserver.js +0 -18
  302. package/Libraries/IntersectionObserver/NativeIntersectionObserver.js +0 -13
  303. package/Libraries/MutationObserver/NativeMutationObserver.js +0 -13
  304. package/Libraries/Utilities/verifyComponentAttributeEquivalence.js +0 -135
  305. package/Microsoft.ReactNative/packages.lock.json +0 -132
  306. package/Microsoft.ReactNative.Managed/packages.lock.json +0 -373
  307. package/Microsoft.ReactNative.Managed.CodeGen/packages.lock.json +0 -3197
  308. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/algorithm/CalculateLayout.cpp +0 -2396
  309. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/config/Config.cpp +0 -136
  310. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/config/Config.h +0 -92
  311. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/LayoutResults.cpp +0 -48
  312. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/LayoutResults.h +0 -122
  313. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/Node.cpp +0 -388
  314. package/ReactCommon/packages.lock.json +0 -30
  315. package/fmt/packages.lock.json +0 -13
  316. package/src/private/core/setUpDOM.js +0 -18
  317. package/src/private/webapis/performance/PerformanceEventTiming.js +0 -55
  318. /package/src/private/{core → styles}/composeStyles.js +0 -0
@@ -0,0 +1,441 @@
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 "NetworkIOAgent.h"
9
+ #include <utility>
10
+ #include "Base64.h"
11
+ #include "Utf8.h"
12
+
13
+ namespace facebook::react::jsinspector_modern {
14
+
15
+ static constexpr long DEFAULT_BYTES_PER_READ =
16
+ 1048576; // 1MB (Chrome v112 default)
17
+
18
+ // https://github.com/chromium/chromium/blob/128.0.6593.1/content/browser/devtools/devtools_io_context.cc#L71-L73
19
+ static constexpr std::array kTextMIMETypePrefixes{
20
+ "text/",
21
+ "application/x-javascript",
22
+ "application/json",
23
+ "application/xml",
24
+ "application/javascript" // Not in Chromium but emitted by Metro
25
+ };
26
+
27
+ // namespace { [Windows #13587]
28
+
29
+ struct InitStreamResult {
30
+ int httpStatusCode;
31
+ Headers headers;
32
+ std::shared_ptr<Stream> stream;
33
+ };
34
+ using InitStreamError = const std::string;
35
+
36
+ using StreamInitCallback =
37
+ std::function<void(std::variant<InitStreamError, InitStreamResult>)>;
38
+ using IOReadCallback =
39
+ std::function<void(std::variant<IOReadError, IOReadResult>)>;
40
+
41
+ /**
42
+ * Private class owning state and implementing the listener for a particular
43
+ * request
44
+ *
45
+ * NetworkRequestListener overrides are thread safe, all other methods must be
46
+ * called from the same thread.
47
+ */
48
+ class Stream : public NetworkRequestListener,
49
+ public EnableExecutorFromThis<Stream> {
50
+ public:
51
+ Stream(const Stream& other) = delete;
52
+ Stream& operator=(const Stream& other) = delete;
53
+ Stream(Stream&& other) = default;
54
+ Stream& operator=(Stream&& other) = default;
55
+
56
+ /**
57
+ * Factory method to create a Stream with a callback for the initial result
58
+ * of a network request.
59
+ * \param executor An executor on which all processing of callbacks from
60
+ * the platform will be performed, and on which the passed callback will be
61
+ * called.
62
+ * \param initCb Will be called once either on receipt of HTTP headers or
63
+ * any prior error, using the given executor.
64
+ */
65
+ static std::shared_ptr<Stream> create(
66
+ VoidExecutor executor,
67
+ StreamInitCallback initCb) {
68
+ std::shared_ptr<Stream> stream{new Stream(initCb)};
69
+ stream->setExecutor(executor);
70
+ return stream;
71
+ }
72
+
73
+ /**
74
+ * Agent-facing API. Enqueue a read request for up to maxBytesToRead
75
+ * bytes, starting from the end of the previous read.
76
+ * \param maxBytesToRead The maximum number of bytes to read from the
77
+ * source stream.
78
+ * \param callback Will be called using the executor passed to create()
79
+ * with the result of the read, or an error string.
80
+ */
81
+ void read(long maxBytesToRead, const IOReadCallback& callback) {
82
+ pendingReadRequests_.emplace_back(
83
+ std::make_tuple(maxBytesToRead, callback));
84
+ processPending();
85
+ }
86
+
87
+ /**
88
+ * Agent-facing API. Call the platform-provided cancelFunction, if any,
89
+ * call the error callbacks of any in-flight read requests, and the initial
90
+ * error callback if it has not already fulfilled with success or error.
91
+ */
92
+ void cancel() {
93
+ if (cancelFunction_) {
94
+ (*cancelFunction_)();
95
+ }
96
+ error_ = "Cancelled";
97
+ if (initCb_) {
98
+ auto cb = std::move(initCb_);
99
+ (*cb)(InitStreamError{"Cancelled"});
100
+ }
101
+ // Respond to any in-flight read requests with an error.
102
+ processPending();
103
+ }
104
+
105
+ /**
106
+ * Begin implementation of NetworkRequestListener, to be called by platform
107
+ * HostTargetDelegate. Any of these methods may be called from any thread.
108
+ */
109
+
110
+ void onData(std::string_view data) override {
111
+ data_ << data;
112
+ bytesReceived_ += data.length();
113
+ processPending();
114
+ }
115
+
116
+ void onHeaders(int httpStatusCode, const Headers& headers) override {
117
+ // Find content-type through case-insensitive search of headers.
118
+ for (const auto& [name, value] : headers) {
119
+ std::string lowerName = name;
120
+ std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), [](unsigned char c) { // [Windows #13587]
121
+ return static_cast<char>(::tolower(c)); // [Windows #13587]
122
+ });
123
+ if (lowerName == "content-type") {
124
+ isText_ = isTextMimeType(value);
125
+ break;
126
+ };
127
+ }
128
+
129
+ // If we've already seen an error, the initial callback as already been
130
+ // called with it.
131
+ if (initCb_) {
132
+ auto cb = std::move(initCb_);
133
+ (*cb)(
134
+ InitStreamResult{httpStatusCode, headers, this->shared_from_this()});
135
+ }
136
+ }
137
+
138
+ void onError(const std::string& message) override {
139
+ // Only call the error callback once.
140
+ if (!error_) {
141
+ error_ = message;
142
+ if (initCb_) {
143
+ auto cb = std::move(initCb_);
144
+ (*cb)(InitStreamError{message});
145
+ }
146
+ }
147
+ processPending();
148
+ }
149
+
150
+ void onCompletion() override {
151
+ completed_ = true;
152
+ processPending();
153
+ }
154
+
155
+ void setCancelFunction(std::function<void()> cancelFunction) override {
156
+ cancelFunction_ = std::move(cancelFunction);
157
+ }
158
+
159
+ ~Stream() override {
160
+ // Cancel any incoming request, if the platform has provided a cancel
161
+ // callback.
162
+ if (cancelFunction_) {
163
+ (*cancelFunction_)();
164
+ }
165
+ }
166
+
167
+ /* End NetworkRequestListener */
168
+
169
+ private:
170
+ /**
171
+ * Private constructor. The caller must call setExecutor immediately
172
+ * afterwards.
173
+ */
174
+ explicit Stream(const StreamInitCallback& initCb)
175
+ : initCb_(std::make_unique<StreamInitCallback>(initCb)) {}
176
+
177
+ void processPending() {
178
+ // Go through each pending request in insertion order - execute the
179
+ // callback and remove it from pending if it can be satisfied.
180
+ for (auto it = pendingReadRequests_.begin();
181
+ it != pendingReadRequests_.end();) {
182
+ auto maxBytesToRead = std::get<0>(*it);
183
+ auto callback = std::get<1>(*it);
184
+
185
+ if (error_) {
186
+ callback(IOReadError{*error_});
187
+ } else if (
188
+ completed_ || (bytesReceived_ - data_.tellg() >= maxBytesToRead)) {
189
+ try {
190
+ callback(respond(maxBytesToRead));
191
+ } catch (const std::runtime_error& error) {
192
+ callback(IOReadError{error.what()});
193
+ }
194
+ } else {
195
+ // Not yet received enough data
196
+ ++it;
197
+ continue;
198
+ }
199
+ it = pendingReadRequests_.erase(it);
200
+ }
201
+ }
202
+
203
+ IOReadResult respond(long maxBytesToRead) {
204
+ std::vector<char> buffer(maxBytesToRead);
205
+ data_.read(buffer.data(), maxBytesToRead);
206
+ auto bytesRead = data_.gcount();
207
+ std::string output;
208
+
209
+ buffer.resize(static_cast<size_t>(bytesRead)); // [Windows #13587]
210
+ if (isText_) {
211
+ auto originalSize = buffer.size();
212
+ // Maybe resize to drop the last 1-3 bytes so that buffer is valid.
213
+ truncateToValidUTF8(buffer);
214
+ if (buffer.size() < originalSize) {
215
+ // Rewind the stream so that the next read starts from the start of
216
+ // the code point we're removing from this chunk.
217
+ data_.seekg(buffer.size() - originalSize, std::ios_base::cur);
218
+ }
219
+ output = std::string(buffer.begin(), buffer.begin() + buffer.size());
220
+ } else {
221
+ // Encode the slice as a base64 string.
222
+ output = base64Encode(std::string_view(buffer.data(), buffer.size()));
223
+ }
224
+
225
+ return IOReadResult{
226
+ .data = output,
227
+ .eof = output.length() == 0 && completed_,
228
+ .base64Encoded = !isText_};
229
+ }
230
+
231
+ // https://github.com/chromium/chromium/blob/128.0.6593.1/content/browser/devtools/devtools_io_context.cc#L70-L80
232
+ static bool isTextMimeType(const std::string& mimeType) {
233
+ for (auto& kTextMIMETypePrefix : kTextMIMETypePrefixes) {
234
+ if (mimeType.starts_with(kTextMIMETypePrefix)) {
235
+ return true;
236
+ }
237
+ }
238
+ return false;
239
+ }
240
+
241
+ bool completed_{false};
242
+ bool isText_{false};
243
+ std::optional<std::string> error_;
244
+ std::stringstream data_;
245
+ size_t bytesReceived_{0}; // [Windows #13587]
246
+ std::optional<std::function<void()>> cancelFunction_{std::nullopt};
247
+ std::unique_ptr<StreamInitCallback> initCb_;
248
+ std::vector<std::tuple<long /* bytesToRead */, IOReadCallback>>
249
+ pendingReadRequests_;
250
+ };
251
+ // } // namespace [Windows #13587]
252
+
253
+ bool NetworkIOAgent::handleRequest(
254
+ const cdp::PreparsedRequest& req,
255
+ LoadNetworkResourceDelegate& delegate) {
256
+ if (req.method == "Network.loadNetworkResource") {
257
+ handleLoadNetworkResource(req, delegate);
258
+ return true;
259
+ } else if (req.method == "IO.read") {
260
+ handleIoRead(req);
261
+ return true;
262
+ } else if (req.method == "IO.close") {
263
+ handleIoClose(req);
264
+ return true;
265
+ }
266
+ return false;
267
+ }
268
+
269
+ void NetworkIOAgent::handleLoadNetworkResource(
270
+ const cdp::PreparsedRequest& req,
271
+ LoadNetworkResourceDelegate& delegate) {
272
+ long long requestId = req.id;
273
+
274
+ LoadNetworkResourceRequest params;
275
+
276
+ if (!req.params.isObject()) {
277
+ frontendChannel_(cdp::jsonError(
278
+ req.id,
279
+ cdp::ErrorCode::InvalidParams,
280
+ "Invalid params: not an object."));
281
+ return;
282
+ }
283
+ if ((req.params.count("url") == 0u) || !req.params.at("url").isString()) {
284
+ frontendChannel_(cdp::jsonError(
285
+ requestId,
286
+ cdp::ErrorCode::InvalidParams,
287
+ "Invalid params: url is missing or not a string."));
288
+ return;
289
+ } else {
290
+ params.url = req.params.at("url").asString();
291
+ }
292
+
293
+ // This is an opaque identifier, but an incrementing integer in a string is
294
+ // consistent with Chrome.
295
+ StreamID streamId = std::to_string(nextStreamId_++);
296
+
297
+ auto stream = Stream::create(
298
+ executor_,
299
+ [streamId,
300
+ requestId,
301
+ frontendChannel = frontendChannel_,
302
+ streamsWeak = std::weak_ptr(streams_)](auto resultOrError) {
303
+ NetworkResource resource;
304
+ std::string cdpError;
305
+ if (auto* error = std::get_if<InitStreamError>(&resultOrError)) {
306
+ resource = NetworkResource{.success = false, .netErrorName = *error};
307
+ } else if (
308
+ auto* result = std::get_if<InitStreamResult>(&resultOrError)) {
309
+ if (result->httpStatusCode >= 200 && result->httpStatusCode < 300) {
310
+ resource = NetworkResource{
311
+ .success = true,
312
+ .stream = streamId,
313
+ .httpStatusCode = result->httpStatusCode,
314
+ .headers = result->headers};
315
+ } else if (result->httpStatusCode >= 400) {
316
+ resource = NetworkResource{
317
+ .success = false,
318
+ .httpStatusCode = result->httpStatusCode,
319
+ .headers = result->headers};
320
+ } else {
321
+ // We can't deal with <200 or 3xx reponses here (though they may be
322
+ // transparently handled by the delegate). Return a CDP error (not
323
+ // an unsuccesful resource) to the frontend so that it falls back to
324
+ // a direct fetch.
325
+ cdpError = "Handling of status " +
326
+ std::to_string(result->httpStatusCode) + " not implemented.";
327
+ }
328
+ } else {
329
+ assert(false && "Unhandled IO init result type");
330
+ }
331
+ if (cdpError.length() > 0 || !resource.success) {
332
+ // Release and destroy the stream after the calling executor returns.
333
+ // ~Stream will handle cancelling any download in progress.
334
+ if (auto streams = streamsWeak.lock()) {
335
+ streams->erase(streamId);
336
+ }
337
+ }
338
+ frontendChannel(
339
+ cdpError.length()
340
+ ? cdp::jsonError(
341
+ requestId, cdp::ErrorCode::InternalError, cdpError)
342
+ : cdp::jsonResult(
343
+ requestId,
344
+ folly::dynamic::object(
345
+ "resource", resource.toDynamic())));
346
+ });
347
+
348
+ // Begin the network request on the platform, passing an executor scoped to
349
+ // a Stream (a NetworkRequestListener), which the implementation will call
350
+ // back into.
351
+ delegate.loadNetworkResource(params, stream->executorFromThis());
352
+
353
+ // Retain the stream only if delegate.loadNetworkResource does not throw.
354
+ streams_->emplace(streamId, stream);
355
+ }
356
+
357
+ void NetworkIOAgent::handleIoRead(const cdp::PreparsedRequest& req) {
358
+ long long requestId = req.id;
359
+ if (!req.params.isObject()) {
360
+ frontendChannel_(cdp::jsonError(
361
+ requestId,
362
+ cdp::ErrorCode::InvalidParams,
363
+ "Invalid params: not an object."));
364
+ return;
365
+ }
366
+ if ((req.params.count("handle") == 0u) ||
367
+ !req.params.at("handle").isString()) {
368
+ frontendChannel_(cdp::jsonError(
369
+ requestId,
370
+ cdp::ErrorCode::InvalidParams,
371
+ "Invalid params: handle is missing or not a string."));
372
+ return;
373
+ }
374
+ std::optional<int64_t> size = std::nullopt; // [Windows #13587]
375
+ if ((req.params.count("size") != 0u) && req.params.at("size").isInt()) {
376
+ size = req.params.at("size").asInt();
377
+ }
378
+
379
+ auto streamId = req.params.at("handle").asString();
380
+ auto it = streams_->find(streamId);
381
+ if (it == streams_->end()) {
382
+ frontendChannel_(cdp::jsonError(
383
+ requestId,
384
+ cdp::ErrorCode::InternalError,
385
+ "Stream not found with handle " + streamId));
386
+ return;
387
+ } else {
388
+ it->second->read(
389
+ size ? static_cast<unsigned long>(*size) : DEFAULT_BYTES_PER_READ, // [Windows #13587]
390
+ [requestId,
391
+ frontendChannel = frontendChannel_,
392
+ streamId,
393
+ streamsWeak = std::weak_ptr(streams_)](auto resultOrError) {
394
+ if (auto* error = std::get_if<IOReadError>(&resultOrError)) {
395
+ // NB: Chrome DevTools calls IO.close after a read error, so any
396
+ // continuing download or retained data is cleaned up at that point.
397
+ frontendChannel(cdp::jsonError(
398
+ requestId, cdp::ErrorCode::InternalError, *error));
399
+ } else if (auto* result = std::get_if<IOReadResult>(&resultOrError)) {
400
+ frontendChannel(cdp::jsonResult(requestId, result->toDynamic()));
401
+ } else {
402
+ assert(false && "Unhandled IO read result type");
403
+ }
404
+ });
405
+ return;
406
+ }
407
+ }
408
+
409
+ void NetworkIOAgent::handleIoClose(const cdp::PreparsedRequest& req) {
410
+ long long requestId = req.id;
411
+ if (!req.params.isObject()) {
412
+ frontendChannel_(cdp::jsonError(
413
+ requestId,
414
+ cdp::ErrorCode::InvalidParams,
415
+ "Invalid params: not an object."));
416
+ return;
417
+ }
418
+ if ((req.params.count("handle") == 0u) ||
419
+ !req.params.at("handle").isString()) {
420
+ frontendChannel_(cdp::jsonError(
421
+ requestId,
422
+ cdp::ErrorCode::InvalidParams,
423
+ "Invalid params: handle is missing or not a string."));
424
+ return;
425
+ }
426
+ auto streamId = req.params.at("handle").asString();
427
+
428
+ auto it = streams_->find(streamId);
429
+ if (it == streams_->end()) {
430
+ frontendChannel_(cdp::jsonError(
431
+ requestId,
432
+ cdp::ErrorCode::InternalError,
433
+ "Stream not found: " + streamId));
434
+ } else {
435
+ it->second->cancel();
436
+ streams_->erase(it->first);
437
+ frontendChannel_(cdp::jsonResult(requestId));
438
+ }
439
+ }
440
+
441
+ } // namespace facebook::react::jsinspector_modern
@@ -0,0 +1,266 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include "CdpJson.h"
11
+ #include "InspectorInterfaces.h"
12
+ #include "ScopedExecutor.h"
13
+
14
+ #include <folly/dynamic.h>
15
+ #include <mutex>
16
+ #include <sstream>
17
+ #include <string>
18
+ #include <unordered_map>
19
+ #include <utility>
20
+ #include <variant>
21
+
22
+ namespace facebook::react::jsinspector_modern {
23
+
24
+ using StreamID = const std::string;
25
+ using Headers = std::map<std::string, std::string>;
26
+ using IOReadError = const std::string;
27
+
28
+ // namespace { [Windows #13587]
29
+ class Stream; // Defined in NetworkIOAgent.cpp
30
+ using StreamsMap = std::unordered_map<std::string, std::shared_ptr<Stream>>;
31
+ // } // namespace [Windows #13587]
32
+
33
+ struct LoadNetworkResourceRequest {
34
+ std::string url;
35
+ };
36
+
37
+ struct ReadStreamParams {
38
+ StreamID handle;
39
+ std::optional<unsigned long> size;
40
+ std::optional<unsigned long> offset;
41
+ };
42
+
43
+ struct NetworkResource {
44
+ bool success{};
45
+ std::optional<std::string> stream;
46
+ std::optional<int> httpStatusCode;
47
+ std::optional<std::string> netErrorName;
48
+ std::optional<Headers> headers;
49
+ folly::dynamic toDynamic() const {
50
+ auto dynamicResource = folly::dynamic::object("success", success);
51
+
52
+ if (success) { // stream IFF successful
53
+ assert(stream);
54
+ dynamicResource("stream", *stream);
55
+ }
56
+
57
+ if (netErrorName) { // Only if unsuccessful
58
+ assert(!success);
59
+ dynamicResource("netErrorName", *netErrorName);
60
+ }
61
+
62
+ if (httpStatusCode) { // Guaranteed if successful
63
+ dynamicResource("httpStatusCode", *httpStatusCode);
64
+ } else {
65
+ assert(!success);
66
+ }
67
+
68
+ if (headers) { // Guaranteed if successful
69
+ auto dynamicHeaders = folly::dynamic::object();
70
+ for (const auto& pair : *headers) {
71
+ dynamicHeaders(pair.first, pair.second);
72
+ }
73
+ dynamicResource("headers", std::move(dynamicHeaders));
74
+ } else {
75
+ assert(!success);
76
+ }
77
+ return dynamicResource;
78
+ }
79
+ };
80
+
81
+ struct IOReadResult {
82
+ std::string data;
83
+ bool eof;
84
+ bool base64Encoded;
85
+ folly::dynamic toDynamic() const {
86
+ auto obj = folly::dynamic::object("data", data);
87
+ obj("eof", eof);
88
+ obj("base64Encoded", base64Encoded);
89
+ return obj;
90
+ }
91
+ };
92
+
93
+ /**
94
+ * Passed to `loadNetworkResource`, provides callbacks for processing incoming
95
+ * data and other events.
96
+ */
97
+ class NetworkRequestListener {
98
+ public:
99
+ NetworkRequestListener() = default;
100
+ NetworkRequestListener(const NetworkRequestListener&) = delete;
101
+ NetworkRequestListener& operator=(const NetworkRequestListener&) = delete;
102
+ NetworkRequestListener(NetworkRequestListener&&) noexcept = default;
103
+ NetworkRequestListener& operator=(NetworkRequestListener&&) noexcept =
104
+ default;
105
+ virtual ~NetworkRequestListener() = default;
106
+
107
+ /**
108
+ * To be called by the delegate on receipt of response headers, including
109
+ * on "unsuccessful" status codes.
110
+ *
111
+ * \param httpStatusCode The HTTP status code received.
112
+ * \param headers Response headers as an unordered_map.
113
+ */
114
+ virtual void onHeaders(int httpStatusCode, const Headers& headers) = 0;
115
+
116
+ /**
117
+ * To be called by the delegate on receipt of data chunks.
118
+ * \param data The data received.
119
+ */
120
+ virtual void onData(std::string_view data) = 0;
121
+
122
+ /**
123
+ * To be called by the delegate on any error with the request, either before
124
+ * headers are received or for a subsequent interrupion.
125
+ *
126
+ * \param message A short, human-readable message, which may be forwarded to
127
+ * the CDP client either in the `loadNetworkResource` response (if headers
128
+ * were not yet received), or as a CDP error in response to a subsequent
129
+ * `IO.read`.
130
+ */
131
+ virtual void onError(const std::string& message) = 0;
132
+
133
+ /**
134
+ * To be called by the delegate on successful completion of the request.
135
+ * Delegates must call *either* onCompletion() or onError() exactly once.
136
+ */
137
+ virtual void onCompletion() = 0;
138
+
139
+ /**
140
+ * Optionally (preferably) used to give NetworkIOAgent
141
+ a way to cancel an
142
+ * in-progress download.
143
+ *
144
+ * \param cancelFunction A function that can be called to cancel a download,
145
+ * may be called before or after the download is complete.
146
+ */
147
+ virtual void setCancelFunction(std::function<void()> cancelFunction) = 0;
148
+ };
149
+
150
+ /**
151
+ * Implemented by the HostTargetDelegate per-platform to perform network
152
+ * requests.
153
+ */
154
+ class LoadNetworkResourceDelegate {
155
+ public:
156
+ LoadNetworkResourceDelegate() = default;
157
+ LoadNetworkResourceDelegate(const LoadNetworkResourceDelegate&) = delete;
158
+ LoadNetworkResourceDelegate& operator=(const LoadNetworkResourceDelegate&) =
159
+ delete;
160
+ LoadNetworkResourceDelegate(LoadNetworkResourceDelegate&&) noexcept = delete;
161
+ LoadNetworkResourceDelegate& operator=(
162
+ LoadNetworkResourceDelegate&&) noexcept = delete;
163
+ virtual ~LoadNetworkResourceDelegate() = default;
164
+
165
+ /**
166
+ * Called by NetworkIOAgent on handling a
167
+ * `Network.loadNetworkResource` CDP request. Platform implementations should
168
+ * override this to perform a network request of the given URL, and use
169
+ * listener's callbacks (via the executor) on receipt of headers, data chunks,
170
+ * and errors.
171
+ *
172
+ * \param params A LoadNetworkResourceRequest, including the url.
173
+ * \param executor A listener-scoped executor used by the delegate to execute
174
+ * listener callbacks on headers, data chunks, and errors. Implementations
175
+ * *should* call listener->setCancelFunction() to provide a lambda that can be
176
+ * called to abort any in-flight network operation that is no longer needed.
177
+ */
178
+ virtual void loadNetworkResource(
179
+ [[maybe_unused]] const LoadNetworkResourceRequest& params,
180
+ [[maybe_unused]] ScopedExecutor<NetworkRequestListener> executor) = 0;
181
+ };
182
+
183
+ /**
184
+ * Provides an agent for handling CDP's Network.loadNetworkResource, IO.read and
185
+ * IO.close.
186
+ *
187
+ * Owns state of all in-progress and completed HTTP requests - ensure
188
+ * IO.close is used to free resources once consumed.
189
+ *
190
+ * Public methods must be called the same thread as the given executor.
191
+ */
192
+ class NetworkIOAgent {
193
+ public:
194
+ /**
195
+ * \param frontendChannel A channel used to send responses to the
196
+ * frontend.
197
+ * \param executor An executor used for any callbacks provided, and for
198
+ * processing incoming data or other events from network operations.
199
+ */
200
+ NetworkIOAgent(FrontendChannel frontendChannel, VoidExecutor executor)
201
+ : frontendChannel_(frontendChannel),
202
+ executor_(executor),
203
+ streams_(std::make_shared<StreamsMap>()) {}
204
+
205
+ /**
206
+ * Handle a CDP request. The response will be sent over the provided
207
+ * \c FrontendChannel synchronously or asynchronously.
208
+ * \param req The parsed request.
209
+ */
210
+ bool handleRequest(
211
+ const cdp::PreparsedRequest& req,
212
+ LoadNetworkResourceDelegate& delegate);
213
+
214
+ private:
215
+ /**
216
+ * A channel used to send responses and events to the frontend.
217
+ */
218
+ FrontendChannel frontendChannel_;
219
+
220
+ /**
221
+ * An executor used to create NetworkRequestListener-scoped executors for the
222
+ * delegate.
223
+ */
224
+ VoidExecutor executor_;
225
+
226
+ /**
227
+ * Map of stream objects, which contain data received, accept read requests
228
+ * and listen for delegate events. Delegates have a scoped executor for Stream
229
+ * instances, but Streams will not live beyond the destruction of this
230
+ * NetworkIOAgent instance + executor scope.
231
+ *
232
+ * This is a shared_ptr so that we may capture a weak_ptr in our
233
+ * Stream::create callback without creating a cycle.
234
+ */
235
+ std::shared_ptr<StreamsMap> streams_;
236
+
237
+ /**
238
+ * Stream IDs are strings of an incrementing integer, unique within each
239
+ * NewtworkIOAgent instance. This stores the next one to use.
240
+ */
241
+ unsigned long nextStreamId_{0};
242
+
243
+ /**
244
+ * Begin loading an HTTP resource, delegating platform-specific
245
+ * implementation, responding to the frontend on headers received or on error.
246
+ * Does not catch exceptions thrown by the delegate (such as
247
+ * NotImplementedException).
248
+ */
249
+ void handleLoadNetworkResource(
250
+ const cdp::PreparsedRequest& req,
251
+ LoadNetworkResourceDelegate& delegate);
252
+
253
+ /**
254
+ * Handle an IO.read CDP request. Emit a chunk of data from the stream, once
255
+ * enough has been downloaded, or report an error.
256
+ */
257
+ void handleIoRead(const cdp::PreparsedRequest& req);
258
+
259
+ /**
260
+ * Handle an IO.close CDP request. Safely aborts any in-flight request.
261
+ * Reports CDP ok if the stream is found, or a CDP error if not.
262
+ */
263
+ void handleIoClose(const cdp::PreparsedRequest& req);
264
+ };
265
+
266
+ } // namespace facebook::react::jsinspector_modern