react-native-windows 0.83.0-preview.3 → 0.84.0-preview.10

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 (237) hide show
  1. package/.flowconfig +2 -2
  2. package/Folly/Folly.vcxproj +2 -0
  3. package/Libraries/Animated/AnimatedEvent.js +2 -2
  4. package/Libraries/Animated/animations/Animation.js +1 -3
  5. package/Libraries/Animated/createAnimatedComponent.js +8 -5
  6. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  7. package/Libraries/Animated/nodes/AnimatedInterpolation.js +40 -4
  8. package/Libraries/Animated/nodes/AnimatedNode.js +3 -3
  9. package/Libraries/Animated/nodes/AnimatedObject.js +16 -11
  10. package/Libraries/Animated/nodes/AnimatedProps.js +43 -12
  11. package/Libraries/Animated/nodes/AnimatedStyle.js +12 -12
  12. package/Libraries/Animated/nodes/AnimatedValue.js +6 -3
  13. package/Libraries/Animated/nodes/AnimatedValueXY.js +1 -1
  14. package/Libraries/BatchedBridge/MessageQueue.js +24 -22
  15. package/Libraries/Blob/URL.js +34 -3
  16. package/Libraries/Blob/URLSearchParams.js +1 -0
  17. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +9 -1
  18. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +6 -1
  19. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.windows.js +6 -1
  20. package/Libraries/Components/Button.js +2 -5
  21. package/Libraries/Components/Button.windows.js +2 -5
  22. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +1 -1
  23. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroidTypes.js +4 -4
  24. package/Libraries/Components/Keyboard/Keyboard.js +2 -2
  25. package/Libraries/Components/Pressable/Pressable.js +8 -8
  26. package/Libraries/Components/Pressable/Pressable.windows.js +14 -13
  27. package/Libraries/Components/TextInput/TextInput.flow.js +13 -13
  28. package/Libraries/Components/TextInput/TextInput.flow.windows.js +19 -18
  29. package/Libraries/Components/TextInput/TextInput.js +33 -34
  30. package/Libraries/Components/TextInput/TextInput.windows.js +40 -39
  31. package/Libraries/Components/Touchable/PooledClass.js +2 -2
  32. package/Libraries/Components/Touchable/TouchableBounce.js +3 -3
  33. package/Libraries/Components/Touchable/TouchableBounce.windows.js +3 -3
  34. package/Libraries/Components/Touchable/TouchableNativeFeedback.js +1 -1
  35. package/Libraries/Components/Touchable/TouchableNativeFeedback.windows.js +1 -1
  36. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +9 -9
  37. package/Libraries/Components/Touchable/TouchableWithoutFeedback.windows.js +9 -9
  38. package/Libraries/Components/View/ViewPropTypes.js +16 -6
  39. package/Libraries/Components/View/ViewPropTypes.windows.js +21 -11
  40. package/Libraries/Core/Devtools/loadBundleFromServer.js +6 -3
  41. package/Libraries/Core/Devtools/loadBundleFromServer.windows.js +6 -3
  42. package/Libraries/Core/Devtools/symbolicateStackTrace.js +1 -1
  43. package/Libraries/Core/ExceptionsManager.js +3 -3
  44. package/Libraries/Core/RawEventEmitter.js +1 -1
  45. package/Libraries/Core/ReactFiberErrorDialog.js +1 -1
  46. package/Libraries/Core/ReactNativeVersion.js +2 -2
  47. package/Libraries/Core/setUpDeveloperTools.js +1 -1
  48. package/Libraries/Core/setUpErrorHandling.js +1 -1
  49. package/Libraries/Core/setUpReactDevTools.js +6 -23
  50. package/Libraries/EventEmitter/NativeEventEmitter.js +2 -2
  51. package/Libraries/Image/Image.android.js +2 -2
  52. package/Libraries/Image/Image.ios.js +2 -2
  53. package/Libraries/Image/Image.windows.js +2 -2
  54. package/Libraries/Image/ImageProps.js +1 -1
  55. package/Libraries/Image/ImageTypes.flow.js +2 -2
  56. package/Libraries/Interaction/InteractionManager.js +3 -3
  57. package/Libraries/Interaction/PanResponder.js +1 -1
  58. package/Libraries/LayoutAnimation/LayoutAnimation.js +1 -1
  59. package/Libraries/Linking/Linking.js +1 -1
  60. package/Libraries/Lists/FlatList.js +2 -2
  61. package/Libraries/LogBox/Data/LogBoxData.js +31 -4
  62. package/Libraries/LogBox/Data/LogBoxLog.js +2 -2
  63. package/Libraries/LogBox/Data/LogBoxSymbolication.js +1 -1
  64. package/Libraries/LogBox/Data/parseLogBoxLog.js +5 -5
  65. package/Libraries/LogBox/LogBox.js +7 -7
  66. package/Libraries/Modal/Modal.windows.js +1 -7
  67. package/Libraries/NativeComponent/BaseViewConfig.android.js +12 -0
  68. package/Libraries/NativeComponent/StaticViewConfigValidator.js +4 -4
  69. package/Libraries/NativeComponent/ViewConfigIgnore.js +1 -1
  70. package/Libraries/NativeComponent/ViewConfigIgnore.windows.js +1 -1
  71. package/Libraries/Network/RCTNetworking.android.js +3 -3
  72. package/Libraries/Network/RCTNetworking.ios.js +2 -2
  73. package/Libraries/Network/RCTNetworking.js.flow +2 -2
  74. package/Libraries/Network/RCTNetworking.windows.js +2 -2
  75. package/Libraries/Pressability/Pressability.js +9 -9
  76. package/Libraries/Pressability/Pressability.windows.js +17 -16
  77. package/Libraries/ReactNative/AppRegistry.flow.js +1 -1
  78. package/Libraries/ReactNative/BridgelessUIManager.js +1 -1
  79. package/Libraries/ReactNative/FabricUIManager.js +1 -1
  80. package/Libraries/ReactNative/PaperUIManager.js +1 -1
  81. package/Libraries/ReactNative/PaperUIManager.windows.js +1 -1
  82. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance.js +1 -1
  83. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstanceUtils.js +2 -2
  84. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactNativeAttributePayload.js +1 -1
  85. package/Libraries/ReactNative/RendererImplementation.js +1 -1
  86. package/Libraries/ReactNative/getNativeComponentAttributes.js +1 -1
  87. package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +1 -2
  88. package/Libraries/Renderer/implementations/ReactFabric-dev.js +3 -3
  89. package/Libraries/Renderer/implementations/ReactFabric-prod.js +3 -3
  90. package/Libraries/Renderer/implementations/ReactFabric-profiling.js +3 -3
  91. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +11 -4
  92. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +11 -4
  93. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +11 -4
  94. package/Libraries/Renderer/shims/ReactFabric.js +3 -1
  95. package/Libraries/Renderer/shims/ReactFeatureFlags.js +3 -1
  96. package/Libraries/Renderer/shims/ReactNative.js +2 -2
  97. package/Libraries/Renderer/shims/ReactNativeTypes.js +3 -1
  98. package/Libraries/Renderer/shims/ReactNativeTypes.windows.js +3 -1
  99. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +3 -1
  100. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +3 -1
  101. package/Libraries/Settings/Settings.ios.js +1 -1
  102. package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +2 -2
  103. package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +1 -1
  104. package/Libraries/StyleSheet/PlatformColorValueTypes.js.flow +4 -2
  105. package/Libraries/StyleSheet/StyleSheetExports.js +1 -1
  106. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +99 -4
  107. package/Libraries/StyleSheet/StyleSheetTypes.js +6 -8
  108. package/Libraries/StyleSheet/processFilter.js +1 -1
  109. package/Libraries/Text/Text.js +46 -6
  110. package/Libraries/Text/Text.windows.js +46 -6
  111. package/Libraries/Text/TextNativeComponent.js +1 -1
  112. package/Libraries/Text/TextProps.js +7 -7
  113. package/Libraries/Text/TextProps.windows.js +7 -7
  114. package/Libraries/Types/CodegenTypes.js +1 -1
  115. package/Libraries/Types/CoreEventTypes.js +31 -0
  116. package/Libraries/Types/CoreEventTypes.windows.js +31 -13
  117. package/Libraries/Types/ReactDevToolsTypes.js +2 -2
  118. package/Libraries/Utilities/Appearance.js +2 -2
  119. package/Libraries/Utilities/DevLoadingView.js +8 -1
  120. package/Libraries/Utilities/DevSettings.js +3 -3
  121. package/Libraries/Utilities/HMRClient.js +4 -3
  122. package/Libraries/Utilities/RCTLog.js +3 -3
  123. package/Libraries/Utilities/ReactNativeTestTools.js +1 -1
  124. package/Libraries/Utilities/SceneTracker.js +1 -1
  125. package/Libraries/Utilities/codegenNativeCommands.js +1 -1
  126. package/Libraries/Utilities/deepFreezeAndThrowOnMutationInDev.js +3 -3
  127. package/Libraries/Utilities/logError.js +1 -1
  128. package/Libraries/Utilities/stringifySafe.js +7 -7
  129. package/Libraries/Utilities/useRefEffect.js +1 -1
  130. package/Libraries/WebSocket/WebSocketInterceptor.js +3 -3
  131. package/Libraries/promiseRejectionTrackingOptions.js +8 -8
  132. package/Libraries/vendor/core/ErrorUtils.js +10 -10
  133. package/Libraries/vendor/emitter/EventEmitter.js +6 -6
  134. package/Microsoft.ReactNative/Fabric/AbiViewProps.cpp +5 -0
  135. package/Microsoft.ReactNative/Fabric/AbiViewProps.h +1 -0
  136. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +58 -20
  137. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +5 -0
  138. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +302 -67
  139. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +19 -4
  140. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +23 -12
  141. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.cpp +4 -0
  142. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.h +1 -0
  143. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +0 -2
  144. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +98 -44
  145. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h +4 -2
  146. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +2 -3
  147. package/Microsoft.ReactNative/Fabric/ReactTaggedView.h +2 -2
  148. package/Microsoft.ReactNative/Fabric/WindowsComponentDescriptorRegistry.cpp +3 -3
  149. package/Microsoft.ReactNative/Fabric/WindowsComponentDescriptorRegistry.h +3 -1
  150. package/Microsoft.ReactNative/Fabric/WindowsImageManager.cpp +0 -1
  151. package/Microsoft.ReactNative/IReactCompositionViewComponentBuilder.idl +2 -0
  152. package/Microsoft.ReactNative/Modules/Animated/AnimatedNode.cpp +3 -3
  153. package/Microsoft.ReactNative/Modules/Animated/AnimatedNode.h +3 -2
  154. package/Microsoft.ReactNative/Modules/Timing.h +2 -1
  155. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +6 -0
  156. package/Microsoft.ReactNative/ViewProps.idl +9 -0
  157. package/Microsoft.ReactNative.Cxx/ReactCommon/TurboModule.h +12 -2
  158. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  159. package/PropertySheets/JSEngine.props +1 -1
  160. package/ReactCommon/ReactCommon.vcxproj +7 -1
  161. package/ReactCommon/ReactCommon.vcxproj.filters +0 -3
  162. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/JSIndexedRAMBundle.cpp +5 -5
  163. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/ReactMarker.cpp +0 -1
  164. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsiexecutor/jsireact/JSIExecutor.cpp +2 -43
  165. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModule.h +12 -2
  166. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/attributedstring/TextAttributes.cpp +291 -0
  167. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/core/EventDispatcher.cpp +0 -1
  168. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/core/EventQueueProcessor.cpp +1 -3
  169. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/core/propsConversions.h +199 -0
  170. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/uimanager/UIManager.cpp +6 -0
  171. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/ReactInstance.cpp +17 -10
  172. package/Scripts/creaternwapp.cmd +8 -1
  173. package/Scripts/creaternwlib.cmd +21 -2
  174. package/Shared/DevSettings.h +0 -3
  175. package/Shared/Modules/WebSocketModule.cpp +0 -1
  176. package/Shared/Modules/WebSocketModule.h +62 -3
  177. package/Shared/OInstance.cpp +5 -0
  178. package/Shared/Shared.vcxitems +4 -6
  179. package/Shared/Shared.vcxitems.filters +218 -709
  180. package/codegen/NativeAccessibilityManagerSpec.g.h +2 -0
  181. package/codegen/NativeAnimatedModuleSpec.g.h +21 -15
  182. package/codegen/NativeDevLoadingViewSpec.g.h +3 -3
  183. package/codegen/NativeIntentAndroidSpec.g.h +16 -3
  184. package/codegen/NativeReactNativeFeatureFlagsSpec.g.h +209 -191
  185. package/codegen/react/components/rnwcore/EventEmitters.h +1 -0
  186. package/codegen/react/components/rnwcore/Props.h +14 -0
  187. package/codegen/rnwcoreJSI.h +246 -211
  188. package/index.js +3 -0
  189. package/index.windows.js +3 -0
  190. package/jest/mock.js +2 -2
  191. package/jest/mockComponent.js +1 -1
  192. package/jest/setup.js +1 -1
  193. package/package.json +22 -21
  194. package/src/private/animated/NativeAnimatedHelper.js +130 -125
  195. package/src/private/animated/NativeAnimatedValidation.js +7 -4
  196. package/src/private/animated/createAnimatedPropsHook.js +13 -5
  197. package/src/private/animated/createAnimatedPropsMemoHook.js +10 -10
  198. package/src/private/components/virtualview/VirtualView.js +16 -9
  199. package/src/private/components/virtualview/logger/VirtualViewLogger.js +21 -0
  200. package/src/private/components/virtualview/logger/VirtualViewLoggerTypes.js +24 -0
  201. package/src/private/devsupport/devmenu/elementinspector/ElementProperties.js +1 -1
  202. package/src/private/devsupport/devmenu/elementinspector/Inspector.js +6 -25
  203. package/src/private/devsupport/devmenu/elementinspector/InspectorPanel.js +1 -27
  204. package/src/private/devsupport/devmenu/elementinspector/XHRInterceptor.js +3 -2
  205. package/src/private/featureflags/ReactNativeFeatureFlags.js +63 -42
  206. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +3 -3
  207. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +12 -9
  208. package/src/private/renderer/errorhandling/ErrorHandlers.js +7 -4
  209. package/src/private/specs_DEPRECATED/modules/NativeAccessibilityManager.js +1 -1
  210. package/src/private/specs_DEPRECATED/modules/NativeAnimatedModule.js +4 -0
  211. package/src/private/specs_DEPRECATED/modules/NativeDevLoadingView.js +1 -0
  212. package/src/private/webapis/dom/events/CustomEvent.js +3 -3
  213. package/src/private/webapis/dom/nodes/internals/ReactNativeDocumentElementInstanceHandle.js +1 -1
  214. package/src/private/webapis/dom/nodes/internals/ReactNativeDocumentInstanceHandle.js +1 -1
  215. package/src/private/webapis/dom/nodes/specs/NativeDOM.js +29 -29
  216. package/src/private/webapis/dom/oldstylecollections/HTMLCollection.js +1 -1
  217. package/src/private/webapis/dom/oldstylecollections/NodeList.js +2 -2
  218. package/src/private/webapis/geometry/DOMRectReadOnly.js +1 -1
  219. package/src/private/webapis/html/events/MessageEvent.js +3 -3
  220. package/src/private/webapis/idlecallbacks/specs/NativeIdleCallbacks.js +3 -3
  221. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +53 -5
  222. package/src/private/webapis/intersectionobserver/internals/IntersectionObserverManager.js +2 -2
  223. package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +4 -4
  224. package/src/private/webapis/microtasks/specs/NativeMicrotasks.js +1 -1
  225. package/src/private/webapis/mutationobserver/MutationObserver.js +1 -1
  226. package/src/private/webapis/mutationobserver/MutationRecord.js +1 -1
  227. package/src/private/webapis/mutationobserver/specs/NativeMutationObserver.js +4 -4
  228. package/src/private/webapis/performance/Performance.js +1 -1
  229. package/src/private/webapis/performance/UserTiming.js +1 -1
  230. package/src/private/webapis/performance/specs/NativePerformance.js +3 -3
  231. package/src/private/webapis/structuredClone/structuredClone.js +3 -3
  232. package/src/types/globals.d.ts +30 -1
  233. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/image/conversions.h +0 -178
  234. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/imagemanager/primitives.h +0 -183
  235. package/Shared/Modules/WebSocketTurboModule.h +0 -71
  236. package/src/private/devsupport/devmenu/elementinspector/NetworkOverlay.js +0 -628
  237. package/src/private/devsupport/devmenu/perfmonitor/PerformanceOverlay.js +0 -66
@@ -14,6 +14,7 @@
14
14
  #include <winrt/Windows.Devices.Input.h>
15
15
  #include <optional>
16
16
  #include <set>
17
+ #include <unordered_set>
17
18
 
18
19
  namespace winrt {
19
20
  using namespace Windows::UI;
@@ -79,7 +80,7 @@ class CompositionEventHandler : public std::enable_shared_from_this<CompositionE
79
80
  bool releasePointerCapture(PointerId pointerId, facebook::react::Tag tag) noexcept;
80
81
 
81
82
  facebook::react::SurfaceId SurfaceId() const noexcept;
82
- winrt::Microsoft::ReactNative::Composition::implementation::RootComponentView &RootComponentView() const noexcept;
83
+ winrt::Microsoft::ReactNative::Composition::implementation::RootComponentView *RootComponentView() const noexcept;
83
84
 
84
85
  enum class UITouchType {
85
86
  Mouse,
@@ -138,9 +139,10 @@ class CompositionEventHandler : public std::enable_shared_from_this<CompositionE
138
139
  /*
139
140
  * A component view on which the touch was begun.
140
141
  */
141
- //__strong UIView<RCTComponentViewProtocol> *componentView = nil;
142
+ ReactTaggedView initialComponentView{nullptr};
142
143
  };
143
144
 
145
+ bool IsPointerWithinInitialTree(const ActiveTouch &activeTouch) noexcept;
144
146
  static bool IsEndishEventType(TouchEventType eventType) noexcept;
145
147
  static const char *PointerTypeCStringFromUITouchType(UITouchType type) noexcept;
146
148
  static facebook::react::PointerEvent CreatePointerEventFromActiveTouch(
@@ -149,18 +151,31 @@ class CompositionEventHandler : public std::enable_shared_from_this<CompositionE
149
151
  static void
150
152
  UpdateActiveTouch(ActiveTouch &activeTouch, facebook::react::Point ptScaled, facebook::react::Point ptLocal) noexcept;
151
153
 
154
+ void DispatchSynthesizedTouchCancelForActiveTouch(
155
+ const ActiveTouch &cancelledTouch,
156
+ const winrt::Microsoft::ReactNative::Composition::Input::PointerPoint &pointerPoint,
157
+ winrt::Windows::System::VirtualKeyModifiers keyModifiers);
158
+
159
+ std::vector<winrt::Microsoft::ReactNative::ComponentView> GetTouchableViewsInPathToRoot(
160
+ const winrt::Microsoft::ReactNative::ComponentView &componentView);
161
+
152
162
  void UpdateCursor() noexcept;
153
163
  void SetCursor(facebook::react::Cursor cursor, HCURSOR hcur) noexcept;
154
164
 
165
+ // Allocates a small touch identifier (0–19) that is safe to use as a JS array index.
166
+ // Windows pointer IDs can be arbitrarily large, which causes React Native to warn and
167
+ // back-fill huge arrays, corrupting touch state after scrolling.
168
+ int AllocateTouchIdentifier() noexcept;
169
+
155
170
  std::map<PointerId, ActiveTouch> m_activeTouches; // iOS is map of touch event args to ActiveTouch..?
156
- PointerId m_touchId = 0;
171
+ int m_touchId = 0; // cycling base used by AllocateTouchIdentifier
157
172
 
158
173
  std::map<PointerId, std::vector<ReactTaggedView>> m_currentlyHoveredViewsPerPointer;
159
174
  winrt::weak_ref<winrt::Microsoft::ReactNative::ReactNativeIsland> m_wkRootView;
160
175
  winrt::Microsoft::ReactNative::ReactContext m_context;
161
176
 
162
177
  facebook::react::Tag m_pointerCapturingComponentTag{-1}; // Component that has captured input
163
- std::vector<PointerId> m_capturedPointers;
178
+ std::unordered_set<PointerId> m_capturedPointers;
164
179
  HCURSOR m_hcursor{nullptr};
165
180
  bool m_hcursorOwned{false}; // If we create the cursor, so we need to destroy it
166
181
  facebook::react::Cursor m_currentCursor{facebook::react::Cursor::Auto};
@@ -6,6 +6,8 @@
6
6
 
7
7
  #include "CompositionViewComponentView.h"
8
8
 
9
+ #include <vector>
10
+
9
11
  #include <AutoDraw.h>
10
12
  #include <Fabric/AbiState.h>
11
13
  #include <Fabric/AbiViewProps.h>
@@ -1013,15 +1015,18 @@ bool ComponentView::anyHitTestHelper(
1013
1015
  facebook::react::Tag &targetTag,
1014
1016
  facebook::react::Point &ptContent,
1015
1017
  facebook::react::Point &localPt) const noexcept {
1016
- if (auto index = m_children.Size()) {
1017
- do {
1018
- index--;
1019
- targetTag = winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(m_children.GetAt(index))
1020
- ->hitTest(ptContent, localPt);
1021
- if (targetTag != -1) {
1022
- return true;
1023
- }
1024
- } while (index != 0);
1018
+ auto size = m_children.Size();
1019
+ if (size == 0) {
1020
+ return false;
1021
+ }
1022
+
1023
+ // m_children is backed by single_threaded_vector (std::vector), so GetAt is O(1)
1024
+ for (uint32_t i = size; i > 0; --i) {
1025
+ targetTag = winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(m_children.GetAt(i - 1))
1026
+ ->hitTest(ptContent, localPt);
1027
+ if (targetTag != -1) {
1028
+ return true;
1029
+ }
1025
1030
  }
1026
1031
 
1027
1032
  return false;
@@ -1180,15 +1185,17 @@ facebook::react::Tag ViewComponentView::hitTest(
1180
1185
 
1181
1186
  facebook::react::Tag targetTag = -1;
1182
1187
 
1188
+ bool isPointInside = ptLocal.x >= 0 && ptLocal.x <= m_layoutMetrics.frame.size.width && ptLocal.y >= 0 &&
1189
+ ptLocal.y <= m_layoutMetrics.frame.size.height;
1190
+
1183
1191
  if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
1184
1192
  m_props->pointerEvents == facebook::react::PointerEventsMode::BoxNone) &&
1185
- anyHitTestHelper(targetTag, ptLocal, localPt))
1193
+ (isPointInside || !viewProps()->getClipsContentToBounds()) && anyHitTestHelper(targetTag, ptLocal, localPt))
1186
1194
  return targetTag;
1187
1195
 
1188
1196
  if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
1189
1197
  m_props->pointerEvents == facebook::react::PointerEventsMode::BoxOnly) &&
1190
- ptLocal.x >= 0 && ptLocal.x <= m_layoutMetrics.frame.size.width && ptLocal.y >= 0 &&
1191
- ptLocal.y <= m_layoutMetrics.frame.size.height) {
1198
+ isPointInside) {
1192
1199
  localPt = ptLocal;
1193
1200
  return Tag();
1194
1201
  }
@@ -1346,6 +1353,10 @@ void ViewComponentView::updateLayoutMetrics(
1346
1353
  void ViewComponentView::updateChildrenClippingPath(
1347
1354
  facebook::react::LayoutMetrics const &layoutMetrics,
1348
1355
  const facebook::react::ViewProps &viewProps) noexcept {
1356
+ // Views with a custom visual to mount children into should to do their own handling of children clipping path
1357
+ if (m_builder && m_builder->VisualToMountChildrenIntoHandler())
1358
+ return;
1359
+
1349
1360
  const float scale = layoutMetrics.pointScaleFactor;
1350
1361
  const float viewWidth = layoutMetrics.frame.size.width * scale;
1351
1362
  const float viewHeight = layoutMetrics.frame.size.height * scale;
@@ -130,6 +130,7 @@ void ImageComponentView::didReceiveImage(const std::shared_ptr<ImageResponseImag
130
130
  #endif
131
131
 
132
132
  m_imageResponseImage = imageResponseImage;
133
+ m_requiresImageRedraw = true;
133
134
  ensureDrawingSurface();
134
135
  }
135
136
 
@@ -310,6 +311,9 @@ void ImageComponentView::ensureDrawingSurface() noexcept {
310
311
  } else if (m_imageResponseImage->m_brushFactory) {
311
312
  Visual().as<Experimental::ISpriteVisual>().Brush(
312
313
  m_imageResponseImage->m_brushFactory(m_reactContext.Handle(), m_compContext));
314
+ } else if (m_requiresImageRedraw) {
315
+ m_requiresImageRedraw = false;
316
+ DrawImage();
313
317
  }
314
318
  }
315
319
 
@@ -96,6 +96,7 @@ struct ImageComponentView : ImageComponentViewT<ImageComponentView, ViewComponen
96
96
  winrt::Microsoft::ReactNative::Composition::Experimental::IDrawingSurfaceBrush m_drawingSurface;
97
97
  std::shared_ptr<ImageResponseImage> m_imageResponseImage;
98
98
  std::shared_ptr<WindowsImageResponseObserver> m_imageResponseObserver;
99
+ bool m_requiresImageRedraw{true};
99
100
  facebook::react::ImageShadowNode::ConcreteState::Shared m_state;
100
101
  };
101
102
 
@@ -981,8 +981,6 @@ void ScrollViewComponentView::OnPointerPressed(
981
981
  Super::OnPointerPressed(args);
982
982
 
983
983
  if (!args.Handled()) {
984
- auto f = args.Pointer();
985
- auto g = f.PointerDeviceType();
986
984
  m_scrollVisual.OnPointerPressed(args);
987
985
  }
988
986
  }
@@ -18,6 +18,7 @@
18
18
  #include <winrt/Microsoft.UI.Input.h>
19
19
  #include <winrt/Windows.System.h>
20
20
  #include <winrt/Windows.UI.h>
21
+ #include <mutex>
21
22
  #include "../Composition.Input.h"
22
23
  #include "../CompositionHelpers.h"
23
24
  #include "../RootComponentView.h"
@@ -75,37 +76,38 @@ WindowsTextInputComponentView::DrawBlock::~DrawBlock() {
75
76
 
76
77
  // Msftedit.dll vs "Riched20.dll"?
77
78
 
79
+ static std::once_flag g_richEditLoadedFlag;
78
80
  static HINSTANCE g_hInstRichEdit = nullptr;
79
81
  static PCreateTextServices g_pfnCreateTextServices;
80
82
 
81
83
  HRESULT HrEnsureRichEd20Loaded() noexcept {
82
- if (g_hInstRichEdit == nullptr) {
84
+ HRESULT hr = S_OK;
85
+ std::call_once(g_richEditLoadedFlag, [&hr]() {
83
86
  g_hInstRichEdit = LoadLibrary(L"Msftedit.dll");
84
- if (!g_hInstRichEdit)
85
- return E_FAIL;
87
+ if (!g_hInstRichEdit) {
88
+ hr = E_FAIL;
89
+ return;
90
+ }
86
91
 
87
92
  // Create the windowless control (text services object)
88
93
  g_pfnCreateTextServices = (PCreateTextServices)GetProcAddress(g_hInstRichEdit, "CreateTextServices");
89
- if (!g_pfnCreateTextServices)
90
- return E_FAIL;
91
-
92
- /*
93
- // Calling the REExtendedRegisterClass() function is required for
94
- // registering the REComboboxW and REListBoxW window classes.
95
- PFNREGISTER pfnRegister = (PFNREGISTER)GetProcAddress(g_hInstRichEdit, "REExtendedRegisterClass");
96
- if (pfnRegister) {
97
- pfnRegister();
98
- return S_OK;
99
- } else
100
- return E_FAIL;
101
- */
102
- }
103
- return NOERROR;
94
+ if (!g_pfnCreateTextServices) {
95
+ hr = E_FAIL;
96
+ return;
97
+ }
98
+ });
99
+ if (!g_hInstRichEdit || !g_pfnCreateTextServices)
100
+ return E_FAIL;
101
+ return hr;
104
102
  }
105
103
 
106
104
  struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
107
105
  CompTextHost(WindowsTextInputComponentView *outer) : m_outer(outer) {}
108
106
 
107
+ void Detach() {
108
+ m_outer = nullptr;
109
+ }
110
+
109
111
  //@cmember Get the DC for the host
110
112
  HDC TxGetDC() override {
111
113
  assert(false);
@@ -144,6 +146,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
144
146
 
145
147
  //@cmember InvalidateRect
146
148
  void TxInvalidateRect(LPCRECT prc, BOOL fMode) override {
149
+ if (!m_outer)
150
+ return;
147
151
  if (m_outer->m_drawing)
148
152
  return;
149
153
  m_outer->DrawText();
@@ -151,6 +155,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
151
155
 
152
156
  //@cmember Send a WM_PAINT to the window
153
157
  void TxViewChange(BOOL fUpdate) override {
158
+ if (!m_outer)
159
+ return;
154
160
  // When keyboard scrolling without scrollbar, TxInvalidateRect is not called.
155
161
  // Instead TxViewChange is called with fUpdate = true
156
162
  // if (fUpdate && !OnInnerViewerExtentChanged())
@@ -163,12 +169,16 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
163
169
 
164
170
  //@cmember Create the caret
165
171
  BOOL TxCreateCaret(HBITMAP hbmp, INT xWidth, INT yHeight) override {
172
+ if (!m_outer)
173
+ return false;
166
174
  m_outer->m_caretVisual.Size({static_cast<float>(xWidth), static_cast<float>(yHeight)});
167
175
  return true;
168
176
  }
169
177
 
170
178
  //@cmember Show the caret
171
179
  BOOL TxShowCaret(BOOL fShow) override {
180
+ if (!m_outer)
181
+ return false;
172
182
  // Only show the caret if we have focus
173
183
  if (fShow && !m_outer->m_hasFocus) {
174
184
  return false;
@@ -179,6 +189,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
179
189
 
180
190
  //@cmember Set the caret position
181
191
  BOOL TxSetCaretPos(INT x, INT y) override {
192
+ if (!m_outer)
193
+ return false;
182
194
  if (x < 0 && y < 0) {
183
195
  // RichEdit sends (-32000,-32000) when the caret is not currently visible.
184
196
  return false;
@@ -217,6 +229,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
217
229
 
218
230
  //@cmember Get mouse capture
219
231
  void TxSetCapture(BOOL fCapture) override {
232
+ if (!m_outer)
233
+ return;
220
234
  auto mousePointer = winrt::make<winrt::Microsoft::ReactNative::Composition::Input::implementation::Pointer>(
221
235
  winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Mouse, 1 /* 1 is Mouse PointerId*/);
222
236
 
@@ -229,6 +243,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
229
243
 
230
244
  //@cmember Set the focus to the text window
231
245
  void TxSetFocus() override {
246
+ if (!m_outer)
247
+ return;
232
248
  winrt::Microsoft::ReactNative::ComponentView view{nullptr};
233
249
  winrt::check_hresult(
234
250
  m_outer->QueryInterface(winrt::guid_of<winrt::Microsoft::ReactNative::ComponentView>(), winrt::put_abi(view)));
@@ -242,11 +258,15 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
242
258
 
243
259
  //@cmember Establish a new cursor shape
244
260
  void TxSetCursor(HCURSOR hcur, BOOL fText) override {
261
+ if (!m_outer)
262
+ return;
245
263
  m_outer->m_hcursor = hcur;
246
264
  }
247
265
 
248
266
  //@cmember Converts screen coordinates of a specified point to the client coordinates
249
267
  BOOL TxScreenToClient(LPPOINT lppt) override {
268
+ if (!m_outer)
269
+ return false;
250
270
  winrt::Windows::Foundation::Point pt{static_cast<float>(lppt->x), static_cast<float>(lppt->y)};
251
271
  pt.X -= m_outer->m_contentOffsetPx.x;
252
272
  pt.Y -= m_outer->m_contentOffsetPx.y;
@@ -258,6 +278,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
258
278
 
259
279
  //@cmember Converts the client coordinates of a specified point to screen coordinates
260
280
  BOOL TxClientToScreen(LPPOINT lppt) override {
281
+ if (!m_outer)
282
+ return false;
261
283
  winrt::Windows::Foundation::Point pt{static_cast<float>(lppt->x), static_cast<float>(lppt->y)};
262
284
 
263
285
  if (!m_outer->m_parent) {
@@ -284,6 +306,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
284
306
 
285
307
  //@cmember Retrieves the coordinates of a window's client area
286
308
  HRESULT TxGetClientRect(LPRECT prc) override {
309
+ if (!m_outer)
310
+ return E_FAIL;
287
311
  *prc = m_outer->getClientRect();
288
312
 
289
313
  prc->top += m_outer->m_contentOffsetPx.y;
@@ -310,6 +334,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
310
334
 
311
335
  //@cmember Get the default character format for the text
312
336
  HRESULT TxGetCharFormat(const CHARFORMATW **ppCF) override {
337
+ if (!m_outer)
338
+ return E_FAIL;
313
339
  m_outer->UpdateCharFormat();
314
340
 
315
341
  *ppCF = &(m_outer->m_cf);
@@ -318,6 +344,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
318
344
 
319
345
  //@cmember Get the default paragraph format for the text
320
346
  HRESULT TxGetParaFormat(const PARAFORMAT **ppPF) override {
347
+ if (!m_outer)
348
+ return E_FAIL;
321
349
  m_outer->UpdateParaFormat();
322
350
 
323
351
  *ppPF = &(m_outer->m_pf);
@@ -326,6 +354,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
326
354
 
327
355
  //@cmember Get the background color for the window
328
356
  COLORREF TxGetSysColor(int nIndex) override {
357
+ if (!m_outer)
358
+ return GetSysColor(nIndex);
329
359
  // if (/* !m_isDisabled || */ nIndex != COLOR_WINDOW && nIndex != COLOR_WINDOWTEXT && nIndex != COLOR_GRAYTEXT) {
330
360
  // This window is either not disabled or the color isn't interesting
331
361
  // in the disabled case.
@@ -400,6 +430,10 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
400
430
 
401
431
  //@cmember Get the maximum length for the text
402
432
  HRESULT TxGetMaxLength(DWORD *plength) override {
433
+ if (!m_outer) {
434
+ *plength = std::numeric_limits<DWORD>::max();
435
+ return S_OK;
436
+ }
403
437
  auto length = m_outer->windowsTextInputProps().maxLength;
404
438
  if (length > static_cast<decltype(m_outer->windowsTextInputProps().maxLength)>(std::numeric_limits<DWORD>::max())) {
405
439
  length = std::numeric_limits<DWORD>::max();
@@ -410,6 +444,10 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
410
444
 
411
445
  //@cmember Get the bits representing requested scroll bars for the window
412
446
  HRESULT TxGetScrollBars(DWORD *pdwScrollBar) override {
447
+ if (!m_outer) {
448
+ *pdwScrollBar = WS_HSCROLL | ES_AUTOHSCROLL;
449
+ return S_OK;
450
+ }
413
451
  if (m_outer->m_multiline) {
414
452
  *pdwScrollBar = WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL;
415
453
  } else {
@@ -457,7 +495,8 @@ struct CompTextHost : public winrt::implements<CompTextHost, ITextHost> {
457
495
 
458
496
  //@cmember Notify host of events
459
497
  HRESULT TxNotify(DWORD iNotify, void *pv) override {
460
- // TODO
498
+ if (!m_outer)
499
+ return S_OK;
461
500
 
462
501
  switch (iNotify) {
463
502
  case EN_UPDATE:
@@ -542,6 +581,16 @@ WindowsTextInputComponentView::WindowsTextInputComponentView(
542
581
  reactContext,
543
582
  ComponentViewFeatures::Default & ~ComponentViewFeatures::Background) {}
544
583
 
584
+ WindowsTextInputComponentView::~WindowsTextInputComponentView() {
585
+ // Release text services first to prevent further callbacks into CompTextHost.
586
+ m_textServices = nullptr;
587
+
588
+ // Detach the CompTextHost so any lingering references cannot use a dangling pointer.
589
+ if (m_textHost) {
590
+ winrt::get_self<CompTextHost>(m_textHost)->Detach();
591
+ }
592
+ }
593
+
545
594
  void WindowsTextInputComponentView::HandleCommand(
546
595
  const winrt::Microsoft::ReactNative::HandleCommandArgs &args) noexcept {
547
596
  Super::HandleCommand(args);
@@ -649,17 +698,22 @@ WPARAM PointerRoutedEventArgsToMouseWParam(
649
698
  return wParam;
650
699
  }
651
700
 
652
- bool WindowsTextInputComponentView::IsDoubleClick() {
701
+ bool WindowsTextInputComponentView::IsDoubleClick(uint32_t pointerId) {
653
702
  using namespace std::chrono;
654
703
 
655
704
  auto now = steady_clock::now();
656
- auto duration = duration_cast<milliseconds>(now - m_lastClickTime).count();
705
+ auto it = m_lastClickTimeByPointer.find(pointerId);
706
+ bool isDouble = false;
657
707
 
658
- const int DOUBLE_CLICK_TIME_MS = ::GetDoubleClickTime();
659
-
660
- m_lastClickTime = now;
708
+ if (it != m_lastClickTimeByPointer.end()) {
709
+ auto duration = duration_cast<milliseconds>(now - it->second).count();
710
+ isDouble = (duration < ::GetDoubleClickTime());
711
+ it->second = now;
712
+ } else {
713
+ m_lastClickTimeByPointer[pointerId] = now;
714
+ }
661
715
 
662
- return (duration < DOUBLE_CLICK_TIME_MS);
716
+ return isDouble;
663
717
  }
664
718
 
665
719
  void WindowsTextInputComponentView::OnPointerPressed(
@@ -678,7 +732,7 @@ void WindowsTextInputComponentView::OnPointerPressed(
678
732
  if (pp.PointerDeviceType() == winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Mouse) {
679
733
  switch (pp.Properties().PointerUpdateKind()) {
680
734
  case winrt::Microsoft::ReactNative::Composition::Input::PointerUpdateKind::LeftButtonPressed:
681
- if (IsDoubleClick()) {
735
+ if (IsDoubleClick(pp.PointerId())) {
682
736
  msg = WM_LBUTTONDBLCLK;
683
737
  } else {
684
738
  msg = WM_LBUTTONDOWN;
@@ -699,10 +753,14 @@ void WindowsTextInputComponentView::OnPointerPressed(
699
753
  wParam |= (XBUTTON2 << 16);
700
754
  break;
701
755
  }
702
- wParam = PointerRoutedEventArgsToMouseWParam(args);
756
+ wParam |= PointerRoutedEventArgsToMouseWParam(args);
703
757
  } else {
704
- msg = WM_POINTERDOWN;
705
- wParam = PointerPointToPointerWParam(pp);
758
+ if (IsDoubleClick(pp.PointerId())) {
759
+ msg = WM_LBUTTONDBLCLK;
760
+ } else {
761
+ msg = WM_LBUTTONDOWN;
762
+ }
763
+ wParam = PointerRoutedEventArgsToMouseWParam(args);
706
764
  }
707
765
 
708
766
  if (m_textServices && msg) {
@@ -764,10 +822,10 @@ void WindowsTextInputComponentView::OnPointerReleased(
764
822
  wParam |= (XBUTTON2 << 16);
765
823
  break;
766
824
  }
767
- wParam = PointerRoutedEventArgsToMouseWParam(args);
825
+ wParam |= PointerRoutedEventArgsToMouseWParam(args);
768
826
  } else {
769
- msg = WM_POINTERUP;
770
- wParam = PointerPointToPointerWParam(pp);
827
+ msg = WM_LBUTTONUP;
828
+ wParam = PointerRoutedEventArgsToMouseWParam(args);
771
829
  }
772
830
 
773
831
  if (m_textServices && msg) {
@@ -817,23 +875,18 @@ void WindowsTextInputComponentView::OnPointerMoved(
817
875
  static_cast<LONG>(position.Y * m_layoutMetrics.pointScaleFactor)};
818
876
  lParam = static_cast<LPARAM>(POINTTOPOINTS(ptContainer));
819
877
 
820
- if (pp.PointerDeviceType() == winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Mouse) {
821
- msg = WM_MOUSEMOVE;
822
- wParam = PointerRoutedEventArgsToMouseWParam(args);
823
- } else {
824
- msg = WM_POINTERUPDATE;
825
- wParam = PointerPointToPointerWParam(pp);
826
- }
878
+ msg = WM_MOUSEMOVE;
879
+ wParam = PointerRoutedEventArgsToMouseWParam(args);
827
880
 
828
881
  if (m_textServices) {
829
882
  LRESULT lresult;
830
883
  DrawBlock db(*this);
831
884
  auto hr = m_textServices->TxSendMessage(msg, static_cast<WPARAM>(wParam), static_cast<LPARAM>(lParam), &lresult);
832
885
  args.Handled(hr != S_FALSE);
833
- }
834
886
 
835
- m_textServices->OnTxSetCursor(
836
- DVASPECT_CONTENT, -1, nullptr, nullptr, nullptr, nullptr, nullptr, ptContainer.x, ptContainer.y);
887
+ m_textServices->OnTxSetCursor(
888
+ DVASPECT_CONTENT, -1, nullptr, nullptr, nullptr, nullptr, nullptr, ptContainer.x, ptContainer.y);
889
+ }
837
890
  }
838
891
 
839
892
  void WindowsTextInputComponentView::OnPointerWheelChanged(
@@ -935,7 +988,7 @@ bool WindowsTextInputComponentView::ShouldSubmit(
935
988
  bool ctrlDown = (args.KeyboardSource().GetKeyState(winrt::Windows::System::VirtualKey::Control) &
936
989
  winrt::Microsoft::UI::Input::VirtualKeyStates::Down) ==
937
990
  winrt::Microsoft::UI::Input::VirtualKeyStates::Down;
938
- bool altDown = (args.KeyboardSource().GetKeyState(winrt::Windows::System::VirtualKey::Control) &
991
+ bool altDown = (args.KeyboardSource().GetKeyState(winrt::Windows::System::VirtualKey::Menu) &
939
992
  winrt::Microsoft::UI::Input::VirtualKeyStates::Down) ==
940
993
  winrt::Microsoft::UI::Input::VirtualKeyStates::Down;
941
994
  bool metaDown = (args.KeyboardSource().GetKeyState(winrt::Windows::System::VirtualKey::LeftWindows) &
@@ -946,7 +999,7 @@ bool WindowsTextInputComponentView::ShouldSubmit(
946
999
  winrt::Microsoft::UI::Input::VirtualKeyStates::Down;
947
1000
  return (submitKeyEvent.shiftKey && shiftDown) || (submitKeyEvent.ctrlKey && ctrlDown) ||
948
1001
  (submitKeyEvent.altKey && altDown) || (submitKeyEvent.metaKey && metaDown) ||
949
- (!submitKeyEvent.shiftKey && !submitKeyEvent.altKey && !submitKeyEvent.metaKey && !submitKeyEvent.altKey &&
1002
+ (!submitKeyEvent.shiftKey && !submitKeyEvent.ctrlKey && !submitKeyEvent.altKey && !submitKeyEvent.metaKey &&
950
1003
  !shiftDown && !ctrlDown && !altDown && !metaDown);
951
1004
  } else {
952
1005
  shouldSubmit = false;
@@ -1836,6 +1889,7 @@ WindowsTextInputComponentView::createVisual() noexcept {
1836
1889
  winrt::com_ptr<::IUnknown> spUnk;
1837
1890
  winrt::check_hresult(g_pfnCreateTextServices(nullptr, m_textHost.get(), spUnk.put()));
1838
1891
  spUnk.as(m_textServices);
1892
+ winrt::check_bool(m_textServices != nullptr);
1839
1893
 
1840
1894
  LRESULT res;
1841
1895
  winrt::check_hresult(m_textServices->TxSendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0, &res));
@@ -11,6 +11,7 @@
11
11
  #include <textserv.h>
12
12
  #include <windows.ui.composition.interop.h>
13
13
  #include <winrt/Windows.UI.Composition.h>
14
+ #include <unordered_map>
14
15
  #include "../ComponentView.h"
15
16
  #include "../CompositionHelpers.h"
16
17
  #include "../CompositionViewComponentView.h"
@@ -74,12 +75,13 @@ struct WindowsTextInputComponentView
74
75
  std::optional<std::string> getAccessiblityValue() noexcept override;
75
76
  void setAcccessiblityValue(std::string &&value) noexcept override;
76
77
  bool getAcccessiblityIsReadOnly() noexcept override;
77
- bool IsDoubleClick();
78
+ bool IsDoubleClick(uint32_t pointerId);
78
79
 
79
80
  WindowsTextInputComponentView(
80
81
  const winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext &compContext,
81
82
  facebook::react::Tag tag,
82
83
  winrt::Microsoft::ReactNative::ReactContext const &reactContext);
84
+ ~WindowsTextInputComponentView();
83
85
 
84
86
  winrt::Microsoft::ReactNative::Composition::Experimental::IVisual createVisual() noexcept;
85
87
 
@@ -152,7 +154,7 @@ struct WindowsTextInputComponentView
152
154
  DWORD m_propBits{0};
153
155
  HCURSOR m_hcursor{nullptr};
154
156
  POINT m_caretPosition{0, 0};
155
- std::chrono::steady_clock::time_point m_lastClickTime{};
157
+ std::unordered_map<uint32_t, std::chrono::steady_clock::time_point> m_lastClickTimeByPointer;
156
158
  std::vector<facebook::react::CompWindowsTextInputSubmitKeyEventsStruct> m_submitKeyEvents;
157
159
  };
158
160
 
@@ -148,9 +148,8 @@ void FabricUIManager::startSurface(
148
148
 
149
149
  {
150
150
  std::unique_lock lock(m_handlerMutex);
151
- auto surfaceHandler = facebook::react::SurfaceHandler{moduleName, surfaceId};
152
- surfaceHandler.setContextContainer(m_scheduler->getContextContainer());
153
- m_handlerRegistry.emplace(surfaceId, std::move(surfaceHandler));
151
+ auto [it, _] = m_handlerRegistry.try_emplace(surfaceId, moduleName, surfaceId);
152
+ it->second.setContextContainer(m_scheduler->getContextContainer());
154
153
  }
155
154
 
156
155
  visit(surfaceId, [&](const facebook::react::SurfaceHandler &surfaceHandler) {
@@ -18,7 +18,7 @@ struct ReactTaggedView {
18
18
  ReactTaggedView(const winrt::Microsoft::ReactNative::ComponentView &componentView)
19
19
  : m_view(componentView), m_tag(componentView ? componentView.Tag() : -1) {}
20
20
 
21
- winrt::Microsoft::ReactNative::ComponentView view() noexcept {
21
+ winrt::Microsoft::ReactNative::ComponentView view() const noexcept {
22
22
  if (!m_view) {
23
23
  return nullptr;
24
24
  }
@@ -37,7 +37,7 @@ struct ReactTaggedView {
37
37
 
38
38
  private:
39
39
  facebook::react::Tag m_tag;
40
- winrt::weak_ref<winrt::Microsoft::ReactNative::ComponentView> m_view;
40
+ mutable winrt::weak_ref<winrt::Microsoft::ReactNative::ComponentView> m_view;
41
41
  };
42
42
 
43
43
  } // namespace Microsoft::ReactNative
@@ -46,12 +46,12 @@ WindowsComponentDescriptorRegistry::WindowsComponentDescriptorRegistry()
46
46
  }
47
47
 
48
48
  void WindowsComponentDescriptorRegistry::add(const facebook::react::ComponentDescriptorProvider &provider) noexcept {
49
- m_componentNames.push_back(provider.name);
49
+ m_componentNames.insert(provider.name);
50
50
  m_componentDescriptorRegistry->add(provider);
51
51
  }
52
52
 
53
53
  bool WindowsComponentDescriptorRegistry::hasComponentProvider(const std::string &name) noexcept {
54
- return std::find(m_componentNames.begin(), m_componentNames.end(), name) != m_componentNames.end();
54
+ return m_componentNames.count(name) != 0;
55
55
  }
56
56
 
57
57
  bool WindowsComponentDescriptorRegistry::isXamlSupportRequired() const noexcept {
@@ -68,7 +68,7 @@ void WindowsComponentDescriptorRegistry::Add(
68
68
  auto builder = winrt::make<winrt::Microsoft::ReactNative::Composition::ReactCompositionViewComponentBuilder>();
69
69
  provider(builder);
70
70
 
71
- m_componentNames.push_back(winrt::to_string(componentName));
71
+ m_componentNames.insert(winrt::to_string(componentName));
72
72
  m_descriptorFlavors.emplace_back(std::make_shared<std::string>(winrt::to_string(componentName)));
73
73
  auto handle = reinterpret_cast<facebook::react::ComponentHandle>(
74
74
  facebook::react::ComponentName(m_descriptorFlavors.back()->c_str()));
@@ -10,6 +10,8 @@
10
10
  #include <ReactPropertyBag.h>
11
11
  #include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
12
12
 
13
+ #include <unordered_set>
14
+
13
15
  namespace Microsoft::ReactNative {
14
16
 
15
17
  struct WindowsComponentDescriptorRegistry {
@@ -41,7 +43,7 @@ struct WindowsComponentDescriptorRegistry {
41
43
  void add(const facebook::react::ComponentDescriptorProvider &provider) noexcept;
42
44
 
43
45
  std::vector<std::shared_ptr<const std::string>> m_descriptorFlavors;
44
- std::vector<std::string> m_componentNames;
46
+ std::unordered_set<std::string> m_componentNames;
45
47
  std::shared_ptr<facebook::react::ComponentDescriptorProviderRegistry> m_componentDescriptorRegistry;
46
48
 
47
49
  std::map<std::shared_ptr<const std::string>, winrt::Microsoft::ReactNative::IReactViewComponentBuilder const>
@@ -72,7 +72,6 @@ wicBitmapSourceFromStream(const winrt::Windows::Storage::Streams::IRandomAccessS
72
72
  return {decodedFrame, imagingFactory, nullptr};
73
73
  } catch (winrt::hresult_error const &ex) {
74
74
  auto errorInfo = std::make_shared<facebook::react::ImageErrorInfo>();
75
- errorInfo = std::make_shared<facebook::react::ImageErrorInfo>();
76
75
  errorInfo->error = ::Microsoft::ReactNative::FormatHResultError(winrt::hresult_error(ex));
77
76
  return {nullptr, nullptr, errorInfo};
78
77
  }
@@ -73,6 +73,8 @@ namespace Microsoft.ReactNative.Composition
73
73
  void SetCreateVisualHandler(CreateVisualDelegate impl);
74
74
  void SetViewFeatures(ComponentViewFeatures viewFeatures);
75
75
  void SetUpdateLayoutMetricsHandler(UpdateLayoutMetricsDelegate impl);
76
+
77
+ DOC_STRING("Provides a customized ContainerVisual that this components children will be mounted into. When overriding this, a clip is no longer automatically applied for overflow:\"hidden\"")
76
78
  void SetVisualToMountChildrenIntoHandler(VisualToMountChildrenIntoDelegate impl);
77
79
  };
78
80