@office-iss/react-native-win32 0.0.0-canary.272 → 0.0.0-canary.274

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 (88) hide show
  1. package/.flowconfig +1 -1
  2. package/CHANGELOG.json +31 -1
  3. package/CHANGELOG.md +20 -4
  4. package/Libraries/Animated/AnimatedEvent.js +1 -1
  5. package/Libraries/Animated/animations/Animation.js +1 -1
  6. package/Libraries/Animated/createAnimatedComponent.js +7 -7
  7. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  8. package/Libraries/Animated/nodes/AnimatedInterpolation.js +1 -1
  9. package/Libraries/Animated/nodes/AnimatedProps.js +1 -1
  10. package/Libraries/Animated/nodes/AnimatedTransform.js +1 -1
  11. package/Libraries/Animated/nodes/AnimatedValue.js +1 -1
  12. package/Libraries/Animated/useAnimatedProps.js +3 -3
  13. package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +1 -1
  14. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +5 -0
  15. package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +3 -2
  16. package/Libraries/Components/ScrollView/ScrollView.js +4 -4
  17. package/Libraries/Components/ScrollView/ScrollViewCommands.js +1 -1
  18. package/Libraries/Components/ScrollView/ScrollViewContext.js +2 -0
  19. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +4 -4
  20. package/Libraries/Components/TextInput/InputAccessoryView.js +1 -1
  21. package/Libraries/Components/TextInput/RCTMultilineTextInputNativeComponent.js +4 -4
  22. package/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js +6 -4
  23. package/Libraries/Components/TextInput/TextInput.d.ts +4 -0
  24. package/Libraries/Components/TextInput/TextInput.flow.js +7 -9
  25. package/Libraries/Components/TextInput/TextInput.js +2 -0
  26. package/Libraries/Components/TextInput/TextInput.win32.js +3 -0
  27. package/Libraries/Components/TextInput/Win32TextInputNativeComponent.js +3 -0
  28. package/Libraries/Components/Touchable/TouchableBounce.js +1 -0
  29. package/Libraries/Components/Touchable/TouchableOpacity.js +1 -0
  30. package/Libraries/Components/View/ViewNativeComponent.js +3 -88
  31. package/Libraries/Components/View/ViewWin32.js +1 -0
  32. package/Libraries/Core/ExceptionsManager.js +44 -27
  33. package/Libraries/Core/ReactNativeVersion.js +1 -1
  34. package/Libraries/Core/__mocks__/NativeExceptionsManager.js +0 -1
  35. package/Libraries/Core/setUpErrorHandling.js +1 -7
  36. package/Libraries/Core/setUpReactDevTools.js +74 -1
  37. package/Libraries/Core/setUpTimers.js +21 -10
  38. package/Libraries/Image/Image.android.js +1 -3
  39. package/Libraries/Image/Image.d.ts +18 -29
  40. package/Libraries/Image/Image.ios.js +0 -2
  41. package/Libraries/Image/Image.win32.js +0 -2
  42. package/Libraries/Inspector/Inspector.js +1 -0
  43. package/Libraries/Inspector/Inspector.win32.js +1 -0
  44. package/Libraries/Lists/SectionListModern.js +7 -7
  45. package/Libraries/LogBox/Data/LogBoxData.js +2 -2
  46. package/Libraries/LogBox/LogBoxInspectorContainer.js +1 -1
  47. package/Libraries/LogBox/LogBoxNotificationContainer.js +2 -2
  48. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
  49. package/Libraries/LogBox/UI/LogBoxInspectorHeader.win32.js +1 -1
  50. package/Libraries/Modal/Modal.js +5 -3
  51. package/Libraries/NativeComponent/BaseViewConfig.android.js +65 -0
  52. package/Libraries/NativeComponent/NativeComponentRegistry.js +3 -3
  53. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +4 -4
  54. package/Libraries/ReactNative/AppContainer.js +1 -1
  55. package/Libraries/ReactNative/AppRegistry.js +1 -1
  56. package/Libraries/ReactNative/DisplayMode.js +1 -1
  57. package/Libraries/ReactNative/RendererImplementation.js +2 -2
  58. package/Libraries/ReactNative/getCachedComponentWithDebugName.js +1 -3
  59. package/Libraries/ReactNative/renderApplication.js +6 -4
  60. package/Libraries/ReactNative/requireNativeComponent.js +3 -1
  61. package/Libraries/Renderer/shims/ReactNativeTypes.js +9 -18
  62. package/Libraries/StyleSheet/StyleSheet.js +7 -1
  63. package/Libraries/StyleSheet/StyleSheet.win32.js +7 -1
  64. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +1 -1
  65. package/Libraries/StyleSheet/StyleSheetTypes.js +1 -1
  66. package/Libraries/Utilities/FocusManager.win32.js +1 -1
  67. package/Libraries/Utilities/codegenNativeComponent.js +1 -1
  68. package/Libraries/Utilities/useMergeRefs.js +26 -7
  69. package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +1 -1
  70. package/index.js +2 -2
  71. package/index.win32.js +2 -2
  72. package/jest/setup.js +1 -0
  73. package/overrides.json +10 -10
  74. package/package.json +12 -12
  75. package/src/private/animated/NativeAnimatedHelper.js +4 -4
  76. package/src/private/animated/NativeAnimatedHelper.win32.js +4 -4
  77. package/src/private/animated/useAnimatedPropsMemo.js +0 -1
  78. package/src/private/components/SafeAreaView_INTERNAL_DO_NOT_USE.js +6 -5
  79. package/src/private/featureflags/ReactNativeFeatureFlags.js +31 -21
  80. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +8 -6
  81. package/src/private/specs/modules/NativeExceptionsManager.js +0 -12
  82. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +6 -0
  83. package/src/private/webapis/performance/EventTiming.js +1 -1
  84. package/src/private/webapis/performance/Performance.js +36 -15
  85. package/src/private/webapis/performance/PerformanceObserver.js +2 -2
  86. package/src/private/webapis/performance/UserTiming.js +5 -5
  87. package/src/private/webapis/performance/specs/NativePerformance.js +18 -2
  88. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceMock.js +32 -12
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<1ef57002084a2e38a69b43b7d4d557a9>>
7
+ * @generated SignedSource<<27ae96c2bc3459bd89e52063a8ed9490>>
8
8
  * @flow strict
9
9
  */
10
10
 
@@ -15,7 +15,7 @@
15
15
  * packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
16
16
  *
17
17
  * To regenerate this code, run the following script from the repo root:
18
- * yarn featureflags-update
18
+ * yarn featureflags --update
19
19
  */
20
20
 
21
21
  import {
@@ -51,13 +51,16 @@ export type ReactNativeFeatureFlagsJsOnlyOverrides = OverridesFor<ReactNativeFea
51
51
  export type ReactNativeFeatureFlags = {
52
52
  ...ReactNativeFeatureFlagsJsOnly,
53
53
  commonTestFlag: Getter<boolean>,
54
+ commonTestFlagWithoutNativeImplementation: Getter<boolean>,
54
55
  allowRecursiveCommitsWithSynchronousMountOnAndroid: Getter<boolean>,
55
56
  batchRenderingUpdatesInEventLoop: Getter<boolean>,
56
57
  completeReactInstanceCreationOnBgThreadOnAndroid: Getter<boolean>,
58
+ disableEventLoopOnBridgeless: Getter<boolean>,
59
+ disableMountItemReorderingAndroid: Getter<boolean>,
57
60
  enableAlignItemsBaselineOnFabricIOS: Getter<boolean>,
58
61
  enableAndroidLineHeightCentering: Getter<boolean>,
59
62
  enableBridgelessArchitecture: Getter<boolean>,
60
- enableCleanTextInputYogaNode: Getter<boolean>,
63
+ enableCppPropsIteratorSetter: Getter<boolean>,
61
64
  enableDeletionOfUnmountedViews: Getter<boolean>,
62
65
  enableEagerRootViewAttachment: Getter<boolean>,
63
66
  enableEventEmitterRetentionDuringGesturesOnAndroid: Getter<boolean>,
@@ -70,15 +73,14 @@ export type ReactNativeFeatureFlags = {
70
73
  enableLayoutAnimationsOnIOS: Getter<boolean>,
71
74
  enableLongTaskAPI: Getter<boolean>,
72
75
  enableMicrotasks: Getter<boolean>,
76
+ enableNewBackgroundAndBorderDrawables: Getter<boolean>,
73
77
  enablePreciseSchedulingForPremountItemsOnAndroid: Getter<boolean>,
74
78
  enablePropsUpdateReconciliationAndroid: Getter<boolean>,
75
79
  enableReportEventPaintTime: Getter<boolean>,
76
80
  enableSynchronousStateUpdates: Getter<boolean>,
77
- enableTextPreallocationOptimisation: Getter<boolean>,
78
81
  enableUIConsistency: Getter<boolean>,
79
82
  enableViewRecycling: Getter<boolean>,
80
83
  excludeYogaFromRawProps: Getter<boolean>,
81
- fetchImagesInViewPreallocation: Getter<boolean>,
82
84
  fixMappingOfEventPrioritiesBetweenFabricAndReact: Getter<boolean>,
83
85
  fixMountingCoordinatorReportedPendingTransactionsOnAndroid: Getter<boolean>,
84
86
  forceBatchingMountItemsOnAndroid: Getter<boolean>,
@@ -87,9 +89,9 @@ export type ReactNativeFeatureFlags = {
87
89
  initEagerTurboModulesOnNativeModulesQueueAndroid: Getter<boolean>,
88
90
  lazyAnimationCallbacks: Getter<boolean>,
89
91
  loadVectorDrawablesOnImages: Getter<boolean>,
90
- removeNestedCallsToDispatchMountItemsOnAndroid: Getter<boolean>,
91
92
  setAndroidLayoutDirection: Getter<boolean>,
92
93
  traceTurboModulePromiseRejectionsOnAndroid: Getter<boolean>,
94
+ useAlwaysAvailableJSErrorHandling: Getter<boolean>,
93
95
  useFabricInterop: Getter<boolean>,
94
96
  useImmediateExecutorInAndroidBridgeless: Getter<boolean>,
95
97
  useModernRuntimeScheduler: Getter<boolean>,
@@ -190,6 +192,10 @@ export const useRefsForTextInputState: Getter<boolean> = createJavaScriptFlagGet
190
192
  * Common flag for testing. Do NOT modify.
191
193
  */
192
194
  export const commonTestFlag: Getter<boolean> = createNativeFlagGetter('commonTestFlag', false);
195
+ /**
196
+ * Common flag for testing (without native implementation). Do NOT modify.
197
+ */
198
+ export const commonTestFlagWithoutNativeImplementation: Getter<boolean> = createNativeFlagGetter('commonTestFlagWithoutNativeImplementation', false);
193
199
  /**
194
200
  * Adds support for recursively processing commits that mount synchronously (Android only).
195
201
  */
@@ -202,6 +208,14 @@ export const batchRenderingUpdatesInEventLoop: Getter<boolean> = createNativeFla
202
208
  * Do not wait for a main-thread dispatch to complete init to start executing work on the JS thread on Android
203
209
  */
204
210
  export const completeReactInstanceCreationOnBgThreadOnAndroid: Getter<boolean> = createNativeFlagGetter('completeReactInstanceCreationOnBgThreadOnAndroid', false);
211
+ /**
212
+ * The bridgeless architecture enables the event loop by default. This feature flag allows us to force disabling it in specific instances.
213
+ */
214
+ export const disableEventLoopOnBridgeless: Getter<boolean> = createNativeFlagGetter('disableEventLoopOnBridgeless', false);
215
+ /**
216
+ * Prevent FabricMountingManager from reordering mountitems, which may lead to invalid state on the UI thread
217
+ */
218
+ export const disableMountItemReorderingAndroid: Getter<boolean> = createNativeFlagGetter('disableMountItemReorderingAndroid', false);
205
219
  /**
206
220
  * Kill-switch to turn off support for aling-items:baseline on Fabric iOS.
207
221
  */
@@ -209,15 +223,15 @@ export const enableAlignItemsBaselineOnFabricIOS: Getter<boolean> = createNative
209
223
  /**
210
224
  * When enabled, custom line height calculation will be centered from top to bottom.
211
225
  */
212
- export const enableAndroidLineHeightCentering: Getter<boolean> = createNativeFlagGetter('enableAndroidLineHeightCentering', false);
226
+ export const enableAndroidLineHeightCentering: Getter<boolean> = createNativeFlagGetter('enableAndroidLineHeightCentering', true);
213
227
  /**
214
228
  * Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the following flags: `useTurboModules` & `enableFabricRenderer.
215
229
  */
216
230
  export const enableBridgelessArchitecture: Getter<boolean> = createNativeFlagGetter('enableBridgelessArchitecture', false);
217
231
  /**
218
- * Clean yoga node when <TextInput /> does not change.
232
+ * Enable prop iterator setter-style construction of Props in C++ (this flag is not used in Java).
219
233
  */
220
- export const enableCleanTextInputYogaNode: Getter<boolean> = createNativeFlagGetter('enableCleanTextInputYogaNode', false);
234
+ export const enableCppPropsIteratorSetter: Getter<boolean> = createNativeFlagGetter('enableCppPropsIteratorSetter', false);
221
235
  /**
222
236
  * Deletes views that were pre-allocated but never mounted on the screen.
223
237
  */
@@ -266,6 +280,10 @@ export const enableLongTaskAPI: Getter<boolean> = createNativeFlagGetter('enable
266
280
  * Enables the use of microtasks in Hermes (scheduling) and RuntimeScheduler (execution).
267
281
  */
268
282
  export const enableMicrotasks: Getter<boolean> = createNativeFlagGetter('enableMicrotasks', false);
283
+ /**
284
+ * Use BackgroundDrawable and BorderDrawable instead of CSSBackgroundDrawable
285
+ */
286
+ export const enableNewBackgroundAndBorderDrawables: Getter<boolean> = createNativeFlagGetter('enableNewBackgroundAndBorderDrawables', false);
269
287
  /**
270
288
  * Moves execution of pre-mount items to outside the choregrapher in the main thread, so we can estimate idle time more precisely (Android only).
271
289
  */
@@ -282,10 +300,6 @@ export const enableReportEventPaintTime: Getter<boolean> = createNativeFlagGette
282
300
  * Dispatches state updates synchronously in Fabric (e.g.: updates the scroll position in the shadow tree synchronously from the main thread).
283
301
  */
284
302
  export const enableSynchronousStateUpdates: Getter<boolean> = createNativeFlagGetter('enableSynchronousStateUpdates', false);
285
- /**
286
- * Text preallocation optimisation where unnecessary work is removed.
287
- */
288
- export const enableTextPreallocationOptimisation: Getter<boolean> = createNativeFlagGetter('enableTextPreallocationOptimisation', false);
289
303
  /**
290
304
  * Ensures that JavaScript always has a consistent view of the state of the UI (e.g.: commits done in other threads are not immediately propagated to JS during its execution).
291
305
  */
@@ -298,10 +312,6 @@ export const enableViewRecycling: Getter<boolean> = createNativeFlagGetter('enab
298
312
  * When enabled, rawProps in Props will not include Yoga specific props.
299
313
  */
300
314
  export const excludeYogaFromRawProps: Getter<boolean> = createNativeFlagGetter('excludeYogaFromRawProps', false);
301
- /**
302
- * Start image fetching during view preallocation instead of waiting for layout pass
303
- */
304
- export const fetchImagesInViewPreallocation: Getter<boolean> = createNativeFlagGetter('fetchImagesInViewPreallocation', false);
305
315
  /**
306
316
  * Uses the default event priority instead of the discreet event priority by default when dispatching events from Fabric to React.
307
317
  */
@@ -334,10 +344,6 @@ export const lazyAnimationCallbacks: Getter<boolean> = createNativeFlagGetter('l
334
344
  * Adds support for loading vector drawable assets in the Image component (only on Android)
335
345
  */
336
346
  export const loadVectorDrawablesOnImages: Getter<boolean> = createNativeFlagGetter('loadVectorDrawablesOnImages', false);
337
- /**
338
- * Removes nested calls to MountItemDispatcher.dispatchMountItems on Android, so we do less work per frame on the UI thread.
339
- */
340
- export const removeNestedCallsToDispatchMountItemsOnAndroid: Getter<boolean> = createNativeFlagGetter('removeNestedCallsToDispatchMountItemsOnAndroid', false);
341
347
  /**
342
348
  * Propagate layout direction to Android views.
343
349
  */
@@ -346,6 +352,10 @@ export const setAndroidLayoutDirection: Getter<boolean> = createNativeFlagGetter
346
352
  * Enables storing js caller stack when creating promise in native module. This is useful in case of Promise rejection and tracing the cause.
347
353
  */
348
354
  export const traceTurboModulePromiseRejectionsOnAndroid: Getter<boolean> = createNativeFlagGetter('traceTurboModulePromiseRejectionsOnAndroid', false);
355
+ /**
356
+ * In Bridgeless mode, use the always available javascript error reporting pipeline.
357
+ */
358
+ export const useAlwaysAvailableJSErrorHandling: Getter<boolean> = createNativeFlagGetter('useAlwaysAvailableJSErrorHandling', false);
349
359
  /**
350
360
  * Should this application enable the Fabric Interop Layer for Android? If yes, the application will behave so that it can accept non-Fabric components and render them on Fabric. This toggle is controlling extra logic such as custom event dispatching that are needed for the Fabric Interop Layer to work correctly.
351
361
  */
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<e6477fcd9bf64a5c84496dfb55ae3700>>
7
+ * @generated SignedSource<<d4297e2a804f238f538463d3d9af480a>>
8
8
  * @flow strict
9
9
  */
10
10
 
@@ -15,7 +15,7 @@
15
15
  * packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
16
16
  *
17
17
  * To regenerate this code, run the following script from the repo root:
18
- * yarn featureflags-update
18
+ * yarn featureflags --update
19
19
  */
20
20
 
21
21
  import type {TurboModule} from '../../../../Libraries/TurboModule/RCTExport';
@@ -24,13 +24,16 @@ import * as TurboModuleRegistry from '../../../../Libraries/TurboModule/TurboMod
24
24
 
25
25
  export interface Spec extends TurboModule {
26
26
  +commonTestFlag?: () => boolean;
27
+ +commonTestFlagWithoutNativeImplementation?: () => boolean;
27
28
  +allowRecursiveCommitsWithSynchronousMountOnAndroid?: () => boolean;
28
29
  +batchRenderingUpdatesInEventLoop?: () => boolean;
29
30
  +completeReactInstanceCreationOnBgThreadOnAndroid?: () => boolean;
31
+ +disableEventLoopOnBridgeless?: () => boolean;
32
+ +disableMountItemReorderingAndroid?: () => boolean;
30
33
  +enableAlignItemsBaselineOnFabricIOS?: () => boolean;
31
34
  +enableAndroidLineHeightCentering?: () => boolean;
32
35
  +enableBridgelessArchitecture?: () => boolean;
33
- +enableCleanTextInputYogaNode?: () => boolean;
36
+ +enableCppPropsIteratorSetter?: () => boolean;
34
37
  +enableDeletionOfUnmountedViews?: () => boolean;
35
38
  +enableEagerRootViewAttachment?: () => boolean;
36
39
  +enableEventEmitterRetentionDuringGesturesOnAndroid?: () => boolean;
@@ -43,15 +46,14 @@ export interface Spec extends TurboModule {
43
46
  +enableLayoutAnimationsOnIOS?: () => boolean;
44
47
  +enableLongTaskAPI?: () => boolean;
45
48
  +enableMicrotasks?: () => boolean;
49
+ +enableNewBackgroundAndBorderDrawables?: () => boolean;
46
50
  +enablePreciseSchedulingForPremountItemsOnAndroid?: () => boolean;
47
51
  +enablePropsUpdateReconciliationAndroid?: () => boolean;
48
52
  +enableReportEventPaintTime?: () => boolean;
49
53
  +enableSynchronousStateUpdates?: () => boolean;
50
- +enableTextPreallocationOptimisation?: () => boolean;
51
54
  +enableUIConsistency?: () => boolean;
52
55
  +enableViewRecycling?: () => boolean;
53
56
  +excludeYogaFromRawProps?: () => boolean;
54
- +fetchImagesInViewPreallocation?: () => boolean;
55
57
  +fixMappingOfEventPrioritiesBetweenFabricAndReact?: () => boolean;
56
58
  +fixMountingCoordinatorReportedPendingTransactionsOnAndroid?: () => boolean;
57
59
  +forceBatchingMountItemsOnAndroid?: () => boolean;
@@ -60,9 +62,9 @@ export interface Spec extends TurboModule {
60
62
  +initEagerTurboModulesOnNativeModulesQueueAndroid?: () => boolean;
61
63
  +lazyAnimationCallbacks?: () => boolean;
62
64
  +loadVectorDrawablesOnImages?: () => boolean;
63
- +removeNestedCallsToDispatchMountItemsOnAndroid?: () => boolean;
64
65
  +setAndroidLayoutDirection?: () => boolean;
65
66
  +traceTurboModulePromiseRejectionsOnAndroid?: () => boolean;
67
+ +useAlwaysAvailableJSErrorHandling?: () => boolean;
66
68
  +useFabricInterop?: () => boolean;
67
69
  +useImmediateExecutorInAndroidBridgeless?: () => boolean;
68
70
  +useModernRuntimeScheduler?: () => boolean;
@@ -47,11 +47,6 @@ export interface Spec extends TurboModule {
47
47
  exceptionId: number,
48
48
  ) => void;
49
49
  +reportException?: (data: ExceptionData) => void;
50
- +updateExceptionMessage: (
51
- message: string,
52
- stack: Array<StackFrame>,
53
- exceptionId: number,
54
- ) => void;
55
50
  // TODO(T53311281): This is a noop on iOS now. Implement it.
56
51
  +dismissRedbox?: () => void;
57
52
  }
@@ -74,13 +69,6 @@ const ExceptionsManager = {
74
69
  ) {
75
70
  NativeModule.reportSoftException(message, stack, exceptionId);
76
71
  },
77
- updateExceptionMessage(
78
- message: string,
79
- stack: Array<StackFrame>,
80
- exceptionId: number,
81
- ) {
82
- NativeModule.updateExceptionMessage(message, stack, exceptionId);
83
- },
84
72
  dismissRedbox(): void {
85
73
  if (Platform.OS !== 'ios' && NativeModule.dismissRedbox) {
86
74
  // TODO(T53311281): This is a noop on iOS now. Implement it.
@@ -131,6 +131,12 @@ export default class IntersectionObserver {
131
131
  * To stop observing the element, call `IntersectionObserver.unobserve()`.
132
132
  */
133
133
  observe(target: ReactNativeElement): void {
134
+ if (target == null) {
135
+ throw new TypeError(
136
+ "Failed to execute 'observe' on 'IntersectionObserver': parameter 1 is null or undefined.",
137
+ );
138
+ }
139
+
134
140
  if (!(target instanceof ReactNativeElement)) {
135
141
  throw new TypeError(
136
142
  "Failed to execute 'observe' on 'IntersectionObserver': parameter 1 is not of type 'ReactNativeElement'.",
@@ -16,8 +16,8 @@ import type {
16
16
  } from './PerformanceEntry';
17
17
 
18
18
  import {PerformanceEntry} from './PerformanceEntry';
19
- import {warnNoNativePerformance} from './Utilities';
20
19
  import NativePerformance from './specs/NativePerformance';
20
+ import {warnNoNativePerformance} from './Utilities';
21
21
 
22
22
  export type PerformanceEventTimingJSON = {
23
23
  ...PerformanceEntryJSON,
@@ -12,8 +12,8 @@
12
12
 
13
13
  import type {
14
14
  DOMHighResTimeStamp,
15
- PerformanceEntryType,
16
15
  PerformanceEntryList,
16
+ PerformanceEntryType,
17
17
  } from './PerformanceEntry';
18
18
  import type {DetailType, PerformanceMarkOptions} from './UserTiming';
19
19
 
@@ -109,15 +109,24 @@ export default class Performance {
109
109
  markName: string,
110
110
  markOptions?: PerformanceMarkOptions,
111
111
  ): PerformanceMark {
112
- const mark = new PerformanceMark(markName, markOptions);
113
-
114
- if (NativePerformance?.mark) {
115
- 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);
116
121
  } else {
117
122
  warnNoNativePerformance();
123
+ computedStartTime = performance.now();
118
124
  }
119
125
 
120
- return mark;
126
+ return new PerformanceMark(markName, {
127
+ startTime: computedStartTime,
128
+ detail: markOptions?.detail,
129
+ });
121
130
  }
122
131
 
123
132
  clearMarks(markName?: string): void {
@@ -143,6 +152,7 @@ export default class Performance {
143
152
 
144
153
  if (typeof startMarkOrOptions === 'string') {
145
154
  startMarkName = startMarkOrOptions;
155
+ options = {};
146
156
  } else if (startMarkOrOptions !== undefined) {
147
157
  options = startMarkOrOptions;
148
158
  if (endMark !== undefined) {
@@ -180,15 +190,20 @@ export default class Performance {
180
190
  duration = options.duration ?? duration;
181
191
  }
182
192
 
183
- const measure = new PerformanceMeasure(measureName, {
184
- // FIXME(T196011255): this is incorrect, as we're only assigning the
185
- // start/end if they're specified as a number, but not if they're
186
- // specified as previous mark names.
187
- startTime,
188
- duration,
189
- });
190
-
191
- 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) {
192
207
  NativePerformance.measure(
193
208
  measureName,
194
209
  startTime,
@@ -201,6 +216,12 @@ export default class Performance {
201
216
  warnNoNativePerformance();
202
217
  }
203
218
 
219
+ const measure = new PerformanceMeasure(measureName, {
220
+ startTime: computedStartTime,
221
+ duration: computedDuration ?? 0,
222
+ detail: options?.detail,
223
+ });
224
+
204
225
  return measure;
205
226
  }
206
227
 
@@ -10,9 +10,10 @@
10
10
 
11
11
  import type {
12
12
  DOMHighResTimeStamp,
13
- PerformanceEntryType,
14
13
  PerformanceEntryList,
14
+ PerformanceEntryType,
15
15
  } from './PerformanceEntry';
16
+ import type {OpaqueNativeObserverHandle} from './specs/NativePerformance';
16
17
 
17
18
  import {PerformanceEventTiming} from './EventTiming';
18
19
  import {
@@ -21,7 +22,6 @@ import {
21
22
  rawToPerformanceEntryType,
22
23
  } from './RawPerformanceEntry';
23
24
  import NativePerformance from './specs/NativePerformance';
24
- import type {OpaqueNativeObserverHandle} from './specs/NativePerformance';
25
25
  import {warnNoNativePerformance} from './Utilities';
26
26
 
27
27
  export {PerformanceEntry} from './PerformanceEntry';
@@ -25,8 +25,8 @@ 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 {
@@ -53,12 +53,12 @@ export class PerformanceMark extends PerformanceEntry {
53
53
  export class PerformanceMeasure extends PerformanceEntry {
54
54
  #detail: DetailType;
55
55
 
56
- constructor(measureName: string, measureOptions?: PerformanceMeasureInit) {
56
+ constructor(measureName: string, measureOptions: PerformanceMeasureInit) {
57
57
  super({
58
58
  name: measureName,
59
59
  entryType: 'measure',
60
- startTime: measureOptions?.startTime ?? 0,
61
- duration: measureOptions?.duration ?? 0,
60
+ startTime: measureOptions.startTime,
61
+ duration: measureOptions.duration,
62
62
  });
63
63
 
64
64
  if (measureOptions) {
@@ -33,6 +33,8 @@ export type RawPerformanceEntry = {
33
33
  export type OpaqueNativeObserverHandle = mixed;
34
34
 
35
35
  export type NativeBatchedObserverCallback = () => void;
36
+ export type NativePerformanceMarkResult = number;
37
+ export type NativePerformanceMeasureResult = $ReadOnlyArray<number>; // [startTime, duration]
36
38
 
37
39
  export type PerformanceObserverInit = {
38
40
  entryTypes?: $ReadOnlyArray<number>,
@@ -43,8 +45,10 @@ export type PerformanceObserverInit = {
43
45
 
44
46
  export interface Spec extends TurboModule {
45
47
  +now?: () => number;
46
- +mark: (name: string, startTime: number) => void;
47
- +measure: (
48
+ // TODO: remove when `markWithResult` is fully rolled out.
49
+ +mark?: (name: string, startTime: number) => void;
50
+ // TODO: remove when `measureWithResult` is fully rolled out.
51
+ +measure?: (
48
52
  name: string,
49
53
  startTime: number,
50
54
  endTime: number,
@@ -52,6 +56,18 @@ export interface Spec extends TurboModule {
52
56
  startMark?: string,
53
57
  endMark?: string,
54
58
  ) => void;
59
+ +markWithResult?: (
60
+ name: string,
61
+ startTime?: number,
62
+ ) => NativePerformanceMarkResult;
63
+ +measureWithResult?: (
64
+ name: string,
65
+ startTime: number,
66
+ endTime: number,
67
+ duration?: number,
68
+ startMark?: string,
69
+ endMark?: string,
70
+ ) => NativePerformanceMeasureResult;
55
71
  +clearMarks?: (entryName?: string) => void;
56
72
  +clearMeasures?: (entryName?: string) => void;
57
73
  +getEntries?: () => $ReadOnlyArray<RawPerformanceEntry>;
@@ -11,13 +11,14 @@
11
11
  import type {
12
12
  NativeBatchedObserverCallback,
13
13
  NativeMemoryInfo,
14
- RawPerformanceEntry,
15
- ReactNativeStartupTiming,
16
- PerformanceObserverInit,
14
+ NativePerformanceMarkResult,
15
+ NativePerformanceMeasureResult,
17
16
  OpaqueNativeObserverHandle,
17
+ PerformanceObserverInit,
18
+ RawPerformanceEntry,
18
19
  RawPerformanceEntryType,
20
+ ReactNativeStartupTiming,
19
21
  } from '../NativePerformance';
20
-
21
22
  import typeof NativePerformance from '../NativePerformance';
22
23
 
23
24
  import {RawPerformanceEntryTypeValues} from '../../RawPerformanceEntry';
@@ -109,32 +110,51 @@ const NativePerformanceMock = {
109
110
 
110
111
  now: (): number => currentTime,
111
112
 
112
- mark: (name: string, startTime: number): void => {
113
- marks.set(name, startTime);
113
+ markWithResult: (
114
+ name: string,
115
+ startTime?: number,
116
+ ): NativePerformanceMarkResult => {
117
+ const computedStartTime = startTime ?? performance.now();
118
+
119
+ marks.set(name, computedStartTime);
114
120
  reportEntry({
115
121
  entryType: RawPerformanceEntryTypeValues.MARK,
116
122
  name,
117
- startTime,
123
+ startTime: computedStartTime,
118
124
  duration: 0,
119
125
  });
126
+
127
+ return computedStartTime;
120
128
  },
121
129
 
122
- measure: (
130
+ measureWithResult: (
123
131
  name: string,
124
132
  startTime: number,
125
133
  endTime: number,
126
134
  duration?: number,
127
135
  startMark?: string,
128
136
  endMark?: string,
129
- ): void => {
130
- const start = startMark != null ? marks.get(startMark) ?? 0 : startTime;
131
- const end = endMark != null ? marks.get(endMark) ?? 0 : endTime;
137
+ ): NativePerformanceMeasureResult => {
138
+ const start = startMark != null ? marks.get(startMark) : startTime;
139
+ const end = endMark != null ? marks.get(endMark) : endTime;
140
+
141
+ if (start === undefined) {
142
+ throw new Error('startMark does not exist');
143
+ }
144
+
145
+ if (end === undefined) {
146
+ throw new Error('endMark does not exist');
147
+ }
148
+
149
+ const computedDuration = duration ?? end - start;
132
150
  reportEntry({
133
151
  entryType: RawPerformanceEntryTypeValues.MEASURE,
134
152
  name,
135
153
  startTime: start,
136
- duration: duration ?? end - start,
154
+ duration: computedDuration,
137
155
  });
156
+
157
+ return [start, computedDuration];
138
158
  },
139
159
 
140
160
  getSimpleMemoryInfo: (): NativeMemoryInfo => {