@office-iss/react-native-win32 0.76.2 → 0.77.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/.eslintignore +1 -1
  2. package/.flowconfig +5 -1
  3. package/CHANGELOG.json +179 -53
  4. package/CHANGELOG.md +82 -28
  5. package/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts +1 -0
  6. package/Libraries/ActionSheetIOS/ActionSheetIOS.js +13 -0
  7. package/Libraries/Animated/AnimatedEvent.js +1 -1
  8. package/Libraries/Animated/AnimatedImplementation.js +2 -2
  9. package/Libraries/Animated/NativeAnimatedAllowlist.js +20 -9
  10. package/Libraries/Animated/animations/Animation.js +60 -25
  11. package/Libraries/Animated/animations/DecayAnimation.js +26 -38
  12. package/Libraries/Animated/animations/SpringAnimation.js +33 -39
  13. package/Libraries/Animated/animations/TimingAnimation.js +34 -42
  14. package/Libraries/Animated/components/AnimatedFlatList.js +1 -1
  15. package/Libraries/Animated/components/AnimatedSectionList.js +3 -1
  16. package/Libraries/Animated/createAnimatedComponent.js +60 -33
  17. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  18. package/Libraries/Animated/nodes/AnimatedInterpolation.js +1 -1
  19. package/Libraries/Animated/nodes/AnimatedNode.js +39 -45
  20. package/Libraries/Animated/nodes/AnimatedObject.js +13 -3
  21. package/Libraries/Animated/nodes/AnimatedProps.js +104 -46
  22. package/Libraries/Animated/nodes/AnimatedStyle.js +116 -39
  23. package/Libraries/Animated/nodes/AnimatedTransform.js +56 -23
  24. package/Libraries/Animated/nodes/AnimatedValue.js +1 -1
  25. package/Libraries/Animated/nodes/AnimatedWithChildren.js +1 -3
  26. package/Libraries/Animated/useAnimatedProps.js +41 -35
  27. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
  28. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +77 -5
  29. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.win32.js +82 -5
  30. package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +4 -4
  31. package/Libraries/Components/Button.js +9 -4
  32. package/Libraries/Components/Button.win32.js +12 -4
  33. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.js +3 -1
  34. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +7 -0
  35. package/Libraries/Components/Pressable/Pressable.js +4 -4
  36. package/Libraries/Components/Pressable/Pressable.win32.js +4 -4
  37. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.android.js +13 -7
  38. package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +3 -2
  39. package/Libraries/Components/SafeAreaView/SafeAreaView.js +4 -4
  40. package/Libraries/Components/SafeAreaView/SafeAreaView.win32.js +4 -4
  41. package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +0 -1
  42. package/Libraries/Components/ScrollView/ScrollView.js +49 -88
  43. package/Libraries/Components/ScrollView/ScrollViewCommands.js +1 -1
  44. package/Libraries/Components/ScrollView/ScrollViewContext.js +2 -0
  45. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +0 -2
  46. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +8 -9
  47. package/Libraries/Components/Switch/Switch.js +8 -6
  48. package/Libraries/Components/TextInput/InputAccessoryView.js +1 -1
  49. package/Libraries/Components/TextInput/RCTMultilineTextInputNativeComponent.js +4 -4
  50. package/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js +6 -4
  51. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +2 -1
  52. package/Libraries/Components/TextInput/TextInput.d.ts +27 -4
  53. package/Libraries/Components/TextInput/TextInput.flow.js +36 -19
  54. package/Libraries/Components/TextInput/TextInput.js +37 -13
  55. package/Libraries/Components/TextInput/TextInput.win32.js +40 -15
  56. package/Libraries/Components/TextInput/TextInputState.js +11 -13
  57. package/Libraries/Components/TextInput/TextInputState.win32.js +13 -16
  58. package/Libraries/Components/TextInput/Win32TextInputNativeComponent.js +3 -0
  59. package/Libraries/Components/Touchable/BoundingDimensions.js +11 -3
  60. package/Libraries/Components/Touchable/Position.js +7 -2
  61. package/Libraries/Components/Touchable/Touchable.js +4 -0
  62. package/Libraries/Components/Touchable/Touchable.win32.js +4 -0
  63. package/Libraries/Components/Touchable/TouchableBounce.js +6 -2
  64. package/Libraries/Components/Touchable/TouchableHighlight.js +5 -5
  65. package/Libraries/Components/Touchable/TouchableOpacity.js +6 -5
  66. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -2
  67. package/Libraries/Components/View/ReactNativeStyleAttributes.js +6 -1
  68. package/Libraries/Components/View/View.js +4 -4
  69. package/Libraries/Components/View/View.win32.js +4 -4
  70. package/Libraries/Components/View/ViewNativeComponent.js +6 -98
  71. package/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
  72. package/Libraries/Components/View/ViewPropTypes.js +0 -3
  73. package/Libraries/Components/View/ViewPropTypes.win32.js +0 -3
  74. package/Libraries/Components/View/ViewWin32.js +1 -0
  75. package/Libraries/Core/ExceptionsManager.js +50 -29
  76. package/Libraries/Core/ReactNativeVersion.js +3 -3
  77. package/Libraries/Core/__mocks__/NativeExceptionsManager.js +0 -1
  78. package/Libraries/Core/setUpBatchedBridge.js +1 -10
  79. package/Libraries/Core/setUpDeveloperTools.js +1 -5
  80. package/Libraries/Core/setUpErrorHandling.js +20 -18
  81. package/Libraries/Core/setUpReactDevTools.js +107 -8
  82. package/Libraries/Core/setUpSegmentFetcher.js +1 -0
  83. package/Libraries/Core/setUpTimers.js +21 -18
  84. package/Libraries/Debugging/DebuggingOverlay.js +4 -5
  85. package/Libraries/Image/AssetSourceResolver.js +12 -1
  86. package/Libraries/Image/Image.android.js +1 -5
  87. package/Libraries/Image/Image.d.ts +20 -29
  88. package/Libraries/Image/Image.ios.js +0 -2
  89. package/Libraries/Image/Image.win32.js +0 -2
  90. package/Libraries/Image/ImageBackground.js +2 -5
  91. package/Libraries/Image/ImageProps.js +7 -6
  92. package/Libraries/Image/ImageResizeMode.d.ts +8 -1
  93. package/Libraries/Image/ImageResizeMode.js +4 -1
  94. package/Libraries/Image/ImageSource.d.ts +0 -2
  95. package/Libraries/Image/ImageSource.js +0 -2
  96. package/Libraries/Image/ImageTypes.flow.js +11 -9
  97. package/Libraries/Image/ImageUtils.js +6 -3
  98. package/Libraries/Image/ImageViewNativeComponent.js +5 -3
  99. package/Libraries/Inspector/Inspector.js +1 -0
  100. package/Libraries/Inspector/Inspector.win32.js +2 -1
  101. package/Libraries/Inspector/NetworkOverlay.js +4 -0
  102. package/Libraries/Inspector/ReactDevToolsOverlay.js +8 -14
  103. package/Libraries/Inspector/getInspectorDataForViewAtPoint.js +3 -5
  104. package/Libraries/Interaction/InteractionManager.js +6 -1
  105. package/Libraries/Interaction/InteractionManagerStub.js +176 -0
  106. package/Libraries/Interaction/TouchHistoryMath.js +22 -19
  107. package/Libraries/JSInspector/NetworkAgent.js +1 -1
  108. package/Libraries/Lists/FlatList.d.ts +1 -2
  109. package/Libraries/Lists/FlatList.js +2 -2
  110. package/Libraries/Lists/SectionListModern.js +7 -7
  111. package/Libraries/Lists/__flowtests__/FlatList-flowtest.js +2 -2
  112. package/Libraries/Lists/__flowtests__/SectionList-flowtest.js +1 -1
  113. package/Libraries/LogBox/Data/LogBoxData.js +3 -3
  114. package/Libraries/LogBox/LogBox.js +18 -5
  115. package/Libraries/LogBox/LogBoxInspectorContainer.js +1 -1
  116. package/Libraries/LogBox/LogBoxNotificationContainer.js +2 -2
  117. package/Libraries/LogBox/UI/AnsiHighlight.js +26 -17
  118. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.js +6 -1
  119. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.win32.js +6 -1
  120. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
  121. package/Libraries/LogBox/UI/LogBoxInspectorHeader.win32.js +1 -1
  122. package/Libraries/LogBox/UI/LogBoxInspectorStackFrames.js +1 -1
  123. package/Libraries/LogBox/UI/LogBoxMessage.js +2 -2
  124. package/Libraries/Modal/Modal.d.ts +12 -0
  125. package/Libraries/Modal/Modal.js +31 -4
  126. package/Libraries/NativeComponent/BaseViewConfig.android.js +72 -1
  127. package/Libraries/NativeComponent/BaseViewConfig.ios.js +2 -1
  128. package/Libraries/NativeComponent/BaseViewConfig.win32.js +3 -11
  129. package/Libraries/NativeComponent/NativeComponentRegistry.js +3 -3
  130. package/Libraries/NativeComponent/StaticViewConfigValidator.js +0 -1
  131. package/Libraries/Network/FormData.js +11 -3
  132. package/Libraries/Network/XHRInterceptor.js +63 -14
  133. package/Libraries/Network/XMLHttpRequest.js +26 -1
  134. package/Libraries/NewAppScreen/components/HermesBadge.js +1 -1
  135. package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +49 -2
  136. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +4 -4
  137. package/Libraries/Pressability/HoverState.js +2 -0
  138. package/Libraries/Pressability/HoverState.win32.js +2 -0
  139. package/Libraries/Pressability/Pressability.js +2 -3
  140. package/Libraries/Pressability/Pressability.win32.js +2 -3
  141. package/Libraries/Pressability/usePressability.js +4 -1
  142. package/Libraries/ReactNative/AppContainer.js +1 -1
  143. package/Libraries/ReactNative/AppRegistry.js +1 -11
  144. package/Libraries/ReactNative/DisplayMode.js +1 -1
  145. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +2 -3
  146. package/Libraries/ReactNative/RendererImplementation.js +18 -17
  147. package/Libraries/ReactNative/getCachedComponentWithDebugName.js +1 -3
  148. package/Libraries/ReactNative/renderApplication.js +9 -8
  149. package/Libraries/ReactNative/requireNativeComponent.js +5 -2
  150. package/Libraries/Renderer/shims/ReactFabric.js +3 -3
  151. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -2
  152. package/Libraries/Renderer/shims/ReactNative.js +3 -3
  153. package/Libraries/Renderer/shims/ReactNativeTypes.js +22 -35
  154. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +5 -6
  155. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
  156. package/Libraries/StyleSheet/StyleSheet.js +7 -1
  157. package/Libraries/StyleSheet/StyleSheet.win32.js +7 -1
  158. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +13 -2
  159. package/Libraries/StyleSheet/StyleSheetTypes.js +24 -6
  160. package/Libraries/StyleSheet/processBackgroundImage.js +87 -110
  161. package/Libraries/StyleSheet/processTransform.js +3 -34
  162. package/Libraries/Text/Text.js +248 -249
  163. package/Libraries/Text/Text.win32.js +282 -295
  164. package/Libraries/Text/TextNativeComponent.js +0 -1
  165. package/Libraries/TurboModule/TurboModuleRegistry.js +5 -5
  166. package/Libraries/Types/CoreEventTypes.d.ts +3 -10
  167. package/Libraries/Types/CoreEventTypes.js +4 -6
  168. package/Libraries/Types/CoreEventTypes.win32.js +4 -6
  169. package/Libraries/Utilities/Appearance.js +3 -1
  170. package/Libraries/Utilities/BackHandler.android.js +6 -18
  171. package/Libraries/Utilities/BackHandler.d.ts +0 -4
  172. package/Libraries/Utilities/BackHandler.ios.js +0 -7
  173. package/Libraries/Utilities/BackHandler.win32.js +6 -18
  174. package/Libraries/Utilities/FocusManager.win32.js +1 -1
  175. package/Libraries/Utilities/HMRClient.js +3 -4
  176. package/Libraries/Utilities/Platform.flow.js +2 -2
  177. package/Libraries/Utilities/Platform.flow.win32.js +3 -2
  178. package/Libraries/Utilities/__mocks__/BackHandler.js +3 -8
  179. package/Libraries/Utilities/codegenNativeComponent.js +1 -1
  180. package/Libraries/Utilities/useMergeRefs.js +26 -7
  181. package/Libraries/WebSocket/WebSocketEvent.js +4 -1
  182. package/Libraries/WebSocket/WebSocketInterceptor.js +31 -13
  183. package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +6 -5
  184. package/Libraries/promiseRejectionTrackingOptions.js +1 -1
  185. package/index.js +10 -3
  186. package/index.win32.js +10 -3
  187. package/jest/setup.js +36 -1
  188. package/overrides.json +37 -37
  189. package/package.json +20 -20
  190. package/src/private/animated/NativeAnimatedHelper.js +18 -16
  191. package/src/private/animated/NativeAnimatedHelper.win32.js +18 -15
  192. package/src/private/animated/useAnimatedPropsMemo.js +356 -0
  193. package/src/private/components/HScrollViewNativeComponents.js +1 -27
  194. package/src/private/components/SafeAreaView_INTERNAL_DO_NOT_USE.js +11 -8
  195. package/src/private/components/VScrollViewNativeComponents.js +2 -25
  196. package/src/private/debugging/ReactDevToolsSettingsManager.android.js +20 -0
  197. package/src/private/debugging/ReactDevToolsSettingsManager.ios.js +30 -0
  198. package/src/private/debugging/ReactDevToolsSettingsManager.win32.js +20 -0
  199. package/src/private/{fusebox → debugging}/setUpFuseboxReactDevToolsDispatcher.js +6 -0
  200. package/src/private/devmenu/DevMenu.d.ts +20 -0
  201. package/src/private/devmenu/DevMenu.js +31 -0
  202. package/src/private/featureflags/ReactNativeFeatureFlags.js +95 -86
  203. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +8 -2
  204. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +17 -19
  205. package/src/private/fusebox/specs/NativeReactDevToolsRuntimeSettingsModule.js +34 -0
  206. package/src/private/setup/setUpDOM.js +14 -6
  207. package/src/private/setup/setUpMutationObserver.js +5 -0
  208. package/src/private/specs/components/AndroidHorizontalScrollContentViewNativeComponent.js +1 -0
  209. package/src/private/specs/components/RCTModalHostViewNativeComponent.js +8 -0
  210. package/src/private/specs/modules/NativeAccessibilityInfo.js +9 -0
  211. package/src/private/specs/modules/NativeAccessibilityInfoWin32.js +9 -0
  212. package/src/private/specs/modules/NativeAccessibilityManager.js +4 -0
  213. package/src/private/specs/modules/NativeActionSheetManager.js +2 -0
  214. package/src/private/specs/modules/NativeAppearance.js +4 -10
  215. package/src/private/specs/modules/NativeExceptionsManager.js +0 -12
  216. package/src/private/specs/modules/{NativeDevToolsSettingsManager.js → NativeReactDevToolsSettingsManager.js} +3 -5
  217. package/src/private/webapis/dom/geometry/DOMRect.js +2 -2
  218. package/src/private/webapis/dom/geometry/DOMRectReadOnly.js +2 -2
  219. package/src/private/webapis/dom/nodes/ReactNativeElement.js +2 -3
  220. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +102 -11
  221. package/src/private/webapis/intersectionobserver/IntersectionObserverEntry.js +26 -0
  222. package/src/private/webapis/intersectionobserver/IntersectionObserverManager.js +1 -0
  223. package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +1 -0
  224. package/src/private/webapis/intersectionobserver/specs/__mocks__/NativeIntersectionObserver.js +9 -0
  225. package/src/private/webapis/performance/EventTiming.js +13 -8
  226. package/src/private/webapis/performance/Performance.js +66 -73
  227. package/src/private/webapis/performance/PerformanceEntry.js +2 -5
  228. package/src/private/webapis/performance/PerformanceObserver.js +65 -164
  229. package/src/private/webapis/performance/RawPerformanceEntry.js +1 -1
  230. package/src/private/webapis/performance/UserTiming.js +11 -7
  231. package/src/private/webapis/performance/Utilities.js +18 -0
  232. package/src/private/webapis/performance/specs/NativePerformance.js +71 -2
  233. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceMock.js +267 -0
  234. package/src-win/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
  235. package/src-win/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
  236. package/types/index.d.ts +1 -1
  237. package/types/public/ReactNativeTypes.d.ts +4 -8
  238. package/Libraries/DevToolsSettings/DevToolsSettingsManager.android.js +0 -35
  239. package/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts +0 -20
  240. package/Libraries/DevToolsSettings/DevToolsSettingsManager.ios.js +0 -49
  241. package/Libraries/DevToolsSettings/DevToolsSettingsManager.win32.js +0 -35
  242. package/Libraries/DevToolsSettings/NativeDevToolsSettingsManager.js +0 -13
  243. package/Libraries/ReactNative/ReactFabricInternals.js +0 -17
  244. package/src/private/components/useSyncOnScroll.js +0 -48
  245. package/src/private/webapis/performance/specs/NativePerformanceObserver.js +0 -61
  246. package/src/private/webapis/performance/specs/__mocks__/NativePerformance.js +0 -67
  247. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceObserver.js +0 -127
  248. package/types/experimental.d.ts +0 -59
  249. /package/src/private/{fusebox → debugging}/FuseboxSessionObserver.js +0 -0
@@ -12,25 +12,21 @@
12
12
 
13
13
  import type {
14
14
  DOMHighResTimeStamp,
15
+ PerformanceEntryList,
15
16
  PerformanceEntryType,
16
17
  } from './PerformanceEntry';
17
- import type {PerformanceEntryList} from './PerformanceObserver';
18
18
  import type {DetailType, PerformanceMarkOptions} from './UserTiming';
19
19
 
20
- import warnOnce from '../../../../Libraries/Utilities/warnOnce';
21
20
  import {EventCounts} from './EventTiming';
22
21
  import MemoryInfo from './MemoryInfo';
23
- import {ALWAYS_LOGGED_ENTRY_TYPES} from './PerformanceEntry';
24
- import {warnNoNativePerformanceObserver} from './PerformanceObserver';
25
22
  import {
26
23
  performanceEntryTypeToRaw,
27
24
  rawToPerformanceEntry,
28
25
  } from './RawPerformanceEntry';
29
- import {RawPerformanceEntryTypeValues} from './RawPerformanceEntry';
30
26
  import ReactNativeStartupTiming from './ReactNativeStartupTiming';
31
27
  import NativePerformance from './specs/NativePerformance';
32
- import NativePerformanceObserver from './specs/NativePerformanceObserver';
33
28
  import {PerformanceMark, PerformanceMeasure} from './UserTiming';
29
+ import {warnNoNativePerformance} from './Utilities';
34
30
 
35
31
  declare var global: {
36
32
  // This value is defined directly via JSI, if available.
@@ -40,24 +36,6 @@ declare var global: {
40
36
  const getCurrentTimeStamp: () => DOMHighResTimeStamp =
41
37
  NativePerformance?.now ?? global.nativePerformanceNow ?? (() => Date.now());
42
38
 
43
- // We want some of the performance entry types to be always logged,
44
- // even if they are not currently observed - this is either to be able to
45
- // retrieve them at any time via Performance.getEntries* or to refer by other entries
46
- // (such as when measures may refer to marks, even if the latter are not observed)
47
- if (NativePerformanceObserver?.setIsBuffered) {
48
- NativePerformanceObserver?.setIsBuffered(
49
- ALWAYS_LOGGED_ENTRY_TYPES.map(performanceEntryTypeToRaw),
50
- true,
51
- );
52
- }
53
-
54
- function warnNoNativePerformance() {
55
- warnOnce(
56
- 'missing-native-performance',
57
- 'Missing native implementation of Performance',
58
- );
59
- }
60
-
61
39
  export type PerformanceMeasureOptions = {
62
40
  detail?: DetailType,
63
41
  start?: DOMHighResTimeStamp,
@@ -65,6 +43,9 @@ export type PerformanceMeasureOptions = {
65
43
  end?: DOMHighResTimeStamp,
66
44
  };
67
45
 
46
+ const ENTRY_TYPES_AVAILABLE_FROM_TIMELINE: $ReadOnlyArray<PerformanceEntryType> =
47
+ ['mark', 'measure'];
48
+
68
49
  /**
69
50
  * Partial implementation of the Performance interface for RN,
70
51
  * corresponding to the standard in
@@ -128,27 +109,33 @@ export default class Performance {
128
109
  markName: string,
129
110
  markOptions?: PerformanceMarkOptions,
130
111
  ): PerformanceMark {
131
- const mark = new PerformanceMark(markName, markOptions);
132
-
133
- if (NativePerformance?.mark) {
134
- NativePerformance.mark(markName, mark.startTime);
112
+ let computedStartTime;
113
+ if (NativePerformance?.markWithResult) {
114
+ computedStartTime = NativePerformance.markWithResult(
115
+ markName,
116
+ markOptions?.startTime,
117
+ );
118
+ } else if (NativePerformance?.mark) {
119
+ computedStartTime = markOptions?.startTime ?? performance.now();
120
+ NativePerformance?.mark?.(markName, computedStartTime);
135
121
  } else {
136
122
  warnNoNativePerformance();
123
+ computedStartTime = performance.now();
137
124
  }
138
125
 
139
- return mark;
126
+ return new PerformanceMark(markName, {
127
+ startTime: computedStartTime,
128
+ detail: markOptions?.detail,
129
+ });
140
130
  }
141
131
 
142
132
  clearMarks(markName?: string): void {
143
- if (!NativePerformanceObserver?.clearEntries) {
144
- warnNoNativePerformanceObserver();
133
+ if (!NativePerformance?.clearMarks) {
134
+ warnNoNativePerformance();
145
135
  return;
146
136
  }
147
137
 
148
- NativePerformanceObserver?.clearEntries(
149
- RawPerformanceEntryTypeValues.MARK,
150
- markName,
151
- );
138
+ NativePerformance.clearMarks(markName);
152
139
  }
153
140
 
154
141
  measure(
@@ -165,6 +152,7 @@ export default class Performance {
165
152
 
166
153
  if (typeof startMarkOrOptions === 'string') {
167
154
  startMarkName = startMarkOrOptions;
155
+ options = {};
168
156
  } else if (startMarkOrOptions !== undefined) {
169
157
  options = startMarkOrOptions;
170
158
  if (endMark !== undefined) {
@@ -202,15 +190,20 @@ export default class Performance {
202
190
  duration = options.duration ?? duration;
203
191
  }
204
192
 
205
- const measure = new PerformanceMeasure(measureName, {
206
- // FIXME(T196011255): this is incorrect, as we're only assigning the
207
- // start/end if they're specified as a number, but not if they're
208
- // specified as previous mark names.
209
- startTime,
210
- duration,
211
- });
212
-
213
- if (NativePerformance?.measure) {
193
+ let computedStartTime = startTime;
194
+ let computedDuration = duration;
195
+
196
+ if (NativePerformance?.measureWithResult) {
197
+ [computedStartTime, computedDuration] =
198
+ NativePerformance.measureWithResult(
199
+ measureName,
200
+ startTime,
201
+ endTime,
202
+ duration,
203
+ startMarkName,
204
+ endMarkName,
205
+ );
206
+ } else if (NativePerformance?.measure) {
214
207
  NativePerformance.measure(
215
208
  measureName,
216
209
  startTime,
@@ -223,19 +216,22 @@ export default class Performance {
223
216
  warnNoNativePerformance();
224
217
  }
225
218
 
219
+ const measure = new PerformanceMeasure(measureName, {
220
+ startTime: computedStartTime,
221
+ duration: computedDuration ?? 0,
222
+ detail: options?.detail,
223
+ });
224
+
226
225
  return measure;
227
226
  }
228
227
 
229
228
  clearMeasures(measureName?: string): void {
230
- if (!NativePerformanceObserver?.clearEntries) {
231
- warnNoNativePerformanceObserver();
229
+ if (!NativePerformance?.clearMeasures) {
230
+ warnNoNativePerformance();
232
231
  return;
233
232
  }
234
233
 
235
- NativePerformanceObserver?.clearEntries(
236
- RawPerformanceEntryTypeValues.MEASURE,
237
- measureName,
238
- );
234
+ NativePerformance?.clearMeasures(measureName);
239
235
  }
240
236
 
241
237
  /**
@@ -252,28 +248,28 @@ export default class Performance {
252
248
  * https://www.w3.org/TR/performance-timeline/#extensions-to-the-performance-interface
253
249
  */
254
250
  getEntries(): PerformanceEntryList {
255
- if (!NativePerformanceObserver?.getEntries) {
256
- warnNoNativePerformanceObserver();
251
+ if (!NativePerformance?.getEntries) {
252
+ warnNoNativePerformance();
257
253
  return [];
258
254
  }
259
- return NativePerformanceObserver.getEntries().map(rawToPerformanceEntry);
255
+ return NativePerformance.getEntries().map(rawToPerformanceEntry);
260
256
  }
261
257
 
262
258
  getEntriesByType(entryType: PerformanceEntryType): PerformanceEntryList {
263
- if (!ALWAYS_LOGGED_ENTRY_TYPES.includes(entryType)) {
264
- console.warn(
265
- `Performance.getEntriesByType: Only valid for ${JSON.stringify(
266
- ALWAYS_LOGGED_ENTRY_TYPES,
267
- )} entry types, got ${entryType}`,
268
- );
259
+ if (
260
+ entryType != null &&
261
+ !ENTRY_TYPES_AVAILABLE_FROM_TIMELINE.includes(entryType)
262
+ ) {
263
+ console.warn('Deprecated API for given entry type.');
269
264
  return [];
270
265
  }
271
266
 
272
- if (!NativePerformanceObserver?.getEntries) {
273
- warnNoNativePerformanceObserver();
267
+ if (!NativePerformance?.getEntriesByType) {
268
+ warnNoNativePerformance();
274
269
  return [];
275
270
  }
276
- return NativePerformanceObserver.getEntries(
271
+
272
+ return NativePerformance.getEntriesByType(
277
273
  performanceEntryTypeToRaw(entryType),
278
274
  ).map(rawToPerformanceEntry);
279
275
  }
@@ -283,24 +279,21 @@ export default class Performance {
283
279
  entryType?: PerformanceEntryType,
284
280
  ): PerformanceEntryList {
285
281
  if (
286
- entryType !== undefined &&
287
- !ALWAYS_LOGGED_ENTRY_TYPES.includes(entryType)
282
+ entryType != null &&
283
+ !ENTRY_TYPES_AVAILABLE_FROM_TIMELINE.includes(entryType)
288
284
  ) {
289
- console.warn(
290
- `Performance.getEntriesByName: Only valid for ${JSON.stringify(
291
- ALWAYS_LOGGED_ENTRY_TYPES,
292
- )} entry types, got ${entryType}`,
293
- );
285
+ console.warn('Deprecated API for given entry type.');
294
286
  return [];
295
287
  }
296
288
 
297
- if (!NativePerformanceObserver?.getEntries) {
298
- warnNoNativePerformanceObserver();
289
+ if (!NativePerformance?.getEntriesByName) {
290
+ warnNoNativePerformance();
299
291
  return [];
300
292
  }
301
- return NativePerformanceObserver.getEntries(
302
- entryType != null ? performanceEntryTypeToRaw(entryType) : undefined,
293
+
294
+ return NativePerformance.getEntriesByName(
303
295
  entryName,
296
+ entryType != null ? performanceEntryTypeToRaw(entryType) : undefined,
304
297
  ).map(rawToPerformanceEntry);
305
298
  }
306
299
  }
@@ -21,11 +21,6 @@ export type PerformanceEntryJSON = {
21
21
  ...
22
22
  };
23
23
 
24
- export const ALWAYS_LOGGED_ENTRY_TYPES: $ReadOnlyArray<PerformanceEntryType> = [
25
- 'mark',
26
- 'measure',
27
- ];
28
-
29
24
  export class PerformanceEntry {
30
25
  #name: string;
31
26
  #entryType: PerformanceEntryType;
@@ -69,3 +64,5 @@ export class PerformanceEntry {
69
64
  };
70
65
  }
71
66
  }
67
+
68
+ export type PerformanceEntryList = $ReadOnlyArray<PerformanceEntry>;
@@ -10,20 +10,19 @@
10
10
 
11
11
  import type {
12
12
  DOMHighResTimeStamp,
13
+ PerformanceEntryList,
13
14
  PerformanceEntryType,
14
15
  } from './PerformanceEntry';
16
+ import type {OpaqueNativeObserverHandle} from './specs/NativePerformance';
15
17
 
16
- import warnOnce from '../../../../Libraries/Utilities/warnOnce';
17
18
  import {PerformanceEventTiming} from './EventTiming';
18
- import {PerformanceEntry} from './PerformanceEntry';
19
19
  import {
20
20
  performanceEntryTypeToRaw,
21
21
  rawToPerformanceEntry,
22
22
  rawToPerformanceEntryType,
23
23
  } from './RawPerformanceEntry';
24
- import NativePerformanceObserver from './specs/NativePerformanceObserver';
25
-
26
- export type PerformanceEntryList = $ReadOnlyArray<PerformanceEntry>;
24
+ import NativePerformance from './specs/NativePerformance';
25
+ import {warnNoNativePerformance} from './Utilities';
27
26
 
28
27
  export {PerformanceEntry} from './PerformanceEntry';
29
28
 
@@ -56,99 +55,34 @@ export class PerformanceObserverEntryList {
56
55
  }
57
56
  }
58
57
 
58
+ export type PerformanceObserverCallbackOptions = {
59
+ droppedEntriesCount: number,
60
+ };
61
+
59
62
  export type PerformanceObserverCallback = (
60
63
  list: PerformanceObserverEntryList,
61
64
  observer: PerformanceObserver,
62
65
  // The number of buffered entries which got dropped from the buffer due to the buffer being full:
63
- droppedEntryCount?: number,
66
+ options?: PerformanceObserverCallbackOptions,
64
67
  ) => void;
65
68
 
66
- export type PerformanceObserverInit =
67
- | {
68
- entryTypes: Array<PerformanceEntryType>,
69
- }
70
- | {
71
- type: PerformanceEntryType,
72
- durationThreshold?: DOMHighResTimeStamp,
73
- };
74
-
75
- type PerformanceObserverConfig = {|
76
- callback: PerformanceObserverCallback,
77
- entryTypes: $ReadOnlySet<PerformanceEntryType>,
78
- durationThreshold: ?number,
79
- |};
80
-
81
- const observerCountPerEntryType: Map<PerformanceEntryType, number> = new Map();
82
- const registeredObservers: Map<PerformanceObserver, PerformanceObserverConfig> =
83
- new Map();
84
- let isOnPerformanceEntryCallbackSet: boolean = false;
85
-
86
- // This is a callback that gets scheduled and periodically called from the native side
87
- const onPerformanceEntry = () => {
88
- if (!NativePerformanceObserver) {
89
- return;
90
- }
91
- const entryResult = NativePerformanceObserver.popPendingEntries();
92
- const rawEntries = entryResult?.entries ?? [];
93
- const droppedEntriesCount = entryResult?.droppedEntriesCount;
94
- if (rawEntries.length === 0) {
95
- return;
96
- }
97
- const entries = rawEntries.map(rawToPerformanceEntry);
98
- for (const [observer, observerConfig] of registeredObservers.entries()) {
99
- const entriesForObserver: PerformanceEntryList = entries.filter(entry => {
100
- if (!observerConfig.entryTypes.has(entry.entryType)) {
101
- return false;
102
- }
103
-
104
- if (
105
- entry.entryType === 'event' &&
106
- observerConfig.durationThreshold != null
107
- ) {
108
- return entry.duration >= observerConfig.durationThreshold;
109
- }
110
-
111
- return true;
112
- });
113
- if (entriesForObserver.length !== 0) {
114
- try {
115
- observerConfig.callback(
116
- new PerformanceObserverEntryList(entriesForObserver),
117
- observer,
118
- droppedEntriesCount,
119
- );
120
- } catch (error) {
121
- console.error(error);
122
- }
123
- }
124
- }
69
+ export type PerformanceObserverInit = {
70
+ entryTypes?: Array<PerformanceEntryType>,
71
+ type?: PerformanceEntryType,
72
+ buffered?: boolean,
73
+ durationThreshold?: DOMHighResTimeStamp,
125
74
  };
126
75
 
127
- export function warnNoNativePerformanceObserver() {
128
- warnOnce(
129
- 'missing-native-performance-observer',
130
- 'Missing native implementation of PerformanceObserver',
131
- );
132
- }
133
-
134
- function applyDurationThresholds() {
135
- const durationThresholds = Array.from(registeredObservers.values())
136
- .map(observerConfig => observerConfig.durationThreshold)
137
- .filter(Boolean);
138
-
139
- return Math.min(...durationThresholds);
140
- }
141
-
142
76
  function getSupportedPerformanceEntryTypes(): $ReadOnlyArray<PerformanceEntryType> {
143
- if (!NativePerformanceObserver) {
77
+ if (!NativePerformance) {
144
78
  return Object.freeze([]);
145
79
  }
146
- if (!NativePerformanceObserver.getSupportedPerformanceEntryTypes) {
80
+ if (!NativePerformance.getSupportedPerformanceEntryTypes) {
147
81
  // fallback if getSupportedPerformanceEntryTypes is not defined on native side
148
82
  return Object.freeze(['mark', 'measure', 'event']);
149
83
  }
150
84
  return Object.freeze(
151
- NativePerformanceObserver.getSupportedPerformanceEntryTypes().map(
85
+ NativePerformance.getSupportedPerformanceEntryTypes().map(
152
86
  rawToPerformanceEntryType,
153
87
  ),
154
88
  );
@@ -175,111 +109,86 @@ function getSupportedPerformanceEntryTypes(): $ReadOnlyArray<PerformanceEntryTyp
175
109
  * observer.observe({ type: "event" });
176
110
  */
177
111
  export class PerformanceObserver {
112
+ #nativeObserverHandle: OpaqueNativeObserverHandle | null = null;
178
113
  #callback: PerformanceObserverCallback;
179
114
  #type: 'single' | 'multiple' | void;
115
+ #calledAtLeastOnce = false;
180
116
 
181
117
  constructor(callback: PerformanceObserverCallback) {
182
118
  this.#callback = callback;
183
119
  }
184
120
 
185
121
  observe(options: PerformanceObserverInit): void {
186
- if (!NativePerformanceObserver) {
187
- warnNoNativePerformanceObserver();
122
+ if (!NativePerformance || NativePerformance.observe == null) {
123
+ warnNoNativePerformance();
188
124
  return;
189
125
  }
190
126
 
191
127
  this.#validateObserveOptions(options);
192
128
 
193
- let requestedEntryTypes;
129
+ if (this.#nativeObserverHandle == null) {
130
+ this.#nativeObserverHandle = this.#createNativeObserver();
131
+ }
194
132
 
195
133
  if (options.entryTypes) {
196
134
  this.#type = 'multiple';
197
- requestedEntryTypes = new Set(options.entryTypes);
198
- } else {
135
+ NativePerformance.observe?.(this.#nativeObserverHandle, {
136
+ entryTypes: options.entryTypes.map(performanceEntryTypeToRaw),
137
+ });
138
+ } else if (options.type) {
199
139
  this.#type = 'single';
200
- requestedEntryTypes = new Set([options.type]);
140
+ NativePerformance.observe?.(this.#nativeObserverHandle, {
141
+ type: performanceEntryTypeToRaw(options.type),
142
+ buffered: options.buffered,
143
+ durationThreshold: options.durationThreshold,
144
+ });
201
145
  }
146
+ }
202
147
 
203
- // The same observer may receive multiple calls to "observe", so we need
204
- // to check what is new on this call vs. previous ones.
205
- const currentEntryTypes = registeredObservers.get(this)?.entryTypes;
206
- const nextEntryTypes = currentEntryTypes
207
- ? union(requestedEntryTypes, currentEntryTypes)
208
- : requestedEntryTypes;
209
-
210
- // This `observe` call is a no-op because there are no new things to observe.
211
- if (currentEntryTypes && currentEntryTypes.size === nextEntryTypes.size) {
148
+ disconnect(): void {
149
+ if (!NativePerformance) {
150
+ warnNoNativePerformance();
212
151
  return;
213
152
  }
214
153
 
215
- registeredObservers.set(this, {
216
- callback: this.#callback,
217
- durationThreshold:
218
- options.type === 'event' ? options.durationThreshold : undefined,
219
- entryTypes: nextEntryTypes,
220
- });
221
-
222
- if (!isOnPerformanceEntryCallbackSet) {
223
- NativePerformanceObserver.setOnPerformanceEntryCallback(
224
- onPerformanceEntry,
225
- );
226
- isOnPerformanceEntryCallbackSet = true;
154
+ if (this.#nativeObserverHandle == null || !NativePerformance.disconnect) {
155
+ return;
227
156
  }
228
157
 
229
- // We only need to start listenening to new entry types being observed in
230
- // this observer.
231
- const newEntryTypes = currentEntryTypes
232
- ? difference(
233
- new Set(requestedEntryTypes.keys()),
234
- new Set(currentEntryTypes.keys()),
235
- )
236
- : new Set(requestedEntryTypes.keys());
237
- for (const type of newEntryTypes) {
238
- if (!observerCountPerEntryType.has(type)) {
239
- const rawType = performanceEntryTypeToRaw(type);
240
- NativePerformanceObserver.startReporting(rawType);
241
- }
242
- observerCountPerEntryType.set(
243
- type,
244
- (observerCountPerEntryType.get(type) ?? 0) + 1,
245
- );
246
- }
247
- applyDurationThresholds();
158
+ NativePerformance.disconnect(this.#nativeObserverHandle);
248
159
  }
249
160
 
250
- disconnect(): void {
251
- if (!NativePerformanceObserver) {
252
- warnNoNativePerformanceObserver();
161
+ #createNativeObserver(): OpaqueNativeObserverHandle {
162
+ if (!NativePerformance || !NativePerformance.createObserver) {
163
+ warnNoNativePerformance();
253
164
  return;
254
165
  }
255
166
 
256
- const observerConfig = registeredObservers.get(this);
257
- if (!observerConfig) {
258
- return;
259
- }
167
+ this.#calledAtLeastOnce = false;
260
168
 
261
- // Disconnect this observer
262
- for (const type of observerConfig.entryTypes.keys()) {
263
- const numberOfObserversForThisType =
264
- observerCountPerEntryType.get(type) ?? 0;
265
- if (numberOfObserversForThisType === 1) {
266
- observerCountPerEntryType.delete(type);
267
- NativePerformanceObserver.stopReporting(
268
- performanceEntryTypeToRaw(type),
269
- );
270
- } else if (numberOfObserversForThisType !== 0) {
271
- observerCountPerEntryType.set(type, numberOfObserversForThisType - 1);
169
+ return NativePerformance.createObserver(() => {
170
+ const rawEntries = NativePerformance.takeRecords?.(
171
+ this.#nativeObserverHandle,
172
+ true, // sort records
173
+ );
174
+ if (!rawEntries) {
175
+ return;
272
176
  }
273
- }
274
177
 
275
- // Disconnect all observers if this was the last one
276
- registeredObservers.delete(this);
277
- if (registeredObservers.size === 0) {
278
- NativePerformanceObserver.setOnPerformanceEntryCallback(undefined);
279
- isOnPerformanceEntryCallbackSet = false;
280
- }
178
+ const entries = rawEntries.map(rawToPerformanceEntry);
179
+ const entryList = new PerformanceObserverEntryList(entries);
180
+
181
+ let droppedEntriesCount = 0;
182
+ if (!this.#calledAtLeastOnce) {
183
+ droppedEntriesCount =
184
+ NativePerformance.getDroppedEntriesCount?.(
185
+ this.#nativeObserverHandle,
186
+ ) ?? 0;
187
+ this.#calledAtLeastOnce = true;
188
+ }
281
189
 
282
- applyDurationThresholds();
190
+ this.#callback(entryList, this, {droppedEntriesCount});
191
+ });
283
192
  }
284
193
 
285
194
  #validateObserveOptions(options: PerformanceObserverInit): void {
@@ -309,7 +218,7 @@ export class PerformanceObserver {
309
218
  );
310
219
  }
311
220
 
312
- if (entryTypes && durationThreshold !== undefined) {
221
+ if (entryTypes && durationThreshold != null) {
313
222
  throw new TypeError(
314
223
  "Failed to execute 'observe' on 'PerformanceObserver': An observe() call must not include both entryTypes and durationThreshold arguments.",
315
224
  );
@@ -320,12 +229,4 @@ export class PerformanceObserver {
320
229
  getSupportedPerformanceEntryTypes();
321
230
  }
322
231
 
323
- function union<T>(a: $ReadOnlySet<T>, b: $ReadOnlySet<T>): Set<T> {
324
- return new Set([...a, ...b]);
325
- }
326
-
327
- function difference<T>(a: $ReadOnlySet<T>, b: $ReadOnlySet<T>): Set<T> {
328
- return new Set([...a].filter(x => !b.has(x)));
329
- }
330
-
331
232
  export {PerformanceEventTiming};
@@ -12,7 +12,7 @@ import type {PerformanceEntryType} from './PerformanceEntry';
12
12
  import type {
13
13
  RawPerformanceEntry,
14
14
  RawPerformanceEntryType,
15
- } from './specs/NativePerformanceObserver';
15
+ } from './specs/NativePerformance';
16
16
 
17
17
  import {PerformanceEventTiming} from './EventTiming';
18
18
  import {PerformanceLongTaskTiming} from './LongTasks';
@@ -25,12 +25,12 @@ export type TimeStampOrName = DOMHighResTimeStamp | string;
25
25
 
26
26
  export type PerformanceMeasureInit = {
27
27
  detail?: DetailType,
28
- startTime?: DOMHighResTimeStamp,
29
- duration?: DOMHighResTimeStamp,
28
+ startTime: DOMHighResTimeStamp,
29
+ duration: DOMHighResTimeStamp,
30
30
  };
31
31
 
32
32
  export class PerformanceMark extends PerformanceEntry {
33
- detail: DetailType;
33
+ #detail: DetailType;
34
34
 
35
35
  constructor(markName: string, markOptions?: PerformanceMarkOptions) {
36
36
  super({
@@ -41,20 +41,24 @@ export class PerformanceMark extends PerformanceEntry {
41
41
  });
42
42
 
43
43
  if (markOptions) {
44
- this.detail = markOptions.detail;
44
+ this.#detail = markOptions.detail;
45
45
  }
46
46
  }
47
+
48
+ get detail(): DetailType {
49
+ return this.#detail;
50
+ }
47
51
  }
48
52
 
49
53
  export class PerformanceMeasure extends PerformanceEntry {
50
54
  #detail: DetailType;
51
55
 
52
- constructor(measureName: string, measureOptions?: PerformanceMeasureInit) {
56
+ constructor(measureName: string, measureOptions: PerformanceMeasureInit) {
53
57
  super({
54
58
  name: measureName,
55
59
  entryType: 'measure',
56
- startTime: measureOptions?.startTime ?? 0,
57
- duration: measureOptions?.duration ?? 0,
60
+ startTime: measureOptions.startTime,
61
+ duration: measureOptions.duration,
58
62
  });
59
63
 
60
64
  if (measureOptions) {
@@ -0,0 +1,18 @@
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
+ * @format
8
+ * @flow strict
9
+ */
10
+
11
+ import warnOnce from '../../../../Libraries/Utilities/warnOnce';
12
+
13
+ export function warnNoNativePerformance() {
14
+ warnOnce(
15
+ 'missing-native-performance',
16
+ 'Missing native implementation of Performance',
17
+ );
18
+ }