@office-iss/react-native-win32 0.71.5 → 0.72.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.flowconfig +15 -3
- package/CHANGELOG.json +302 -47
- package/CHANGELOG.md +141 -27
- package/IntegrationTests/IntegrationTestHarnessTest.js +1 -0
- package/Libraries/ActionSheetIOS/ActionSheetIOS.js +1 -1
- package/Libraries/Alert/Alert.d.ts +4 -4
- package/Libraries/Alert/Alert.win32.js +1 -0
- package/Libraries/Animated/Animated.d.ts +17 -6
- package/Libraries/Animated/NativeAnimatedHelper.js +18 -6
- package/Libraries/Animated/NativeAnimatedHelper.win32.js +606 -0
- package/Libraries/Animated/bezier.js +1 -1
- package/Libraries/Animated/components/AnimatedFlatList.js +8 -3
- package/Libraries/Animated/components/AnimatedScrollView.js +4 -1
- package/Libraries/Animated/components/AnimatedSectionList.js +12 -3
- package/Libraries/Animated/createAnimatedComponent.js +26 -239
- package/Libraries/Animated/nodes/AnimatedColor.js +47 -80
- package/Libraries/Animated/nodes/AnimatedInterpolation.js +167 -121
- package/Libraries/Animated/nodes/AnimatedNode.js +3 -5
- package/Libraries/Animated/nodes/AnimatedProps.js +7 -6
- package/Libraries/Animated/nodes/AnimatedStyle.js +42 -8
- package/Libraries/Animated/nodes/AnimatedTransform.js +1 -1
- package/Libraries/Animated/nodes/AnimatedValue.js +8 -12
- package/Libraries/Animated/nodes/AnimatedWithChildren.js +1 -1
- package/Libraries/Animated/useAnimatedProps.js +7 -10
- package/Libraries/BatchedBridge/MessageQueue.js +2 -1
- package/Libraries/BatchedBridge/NativeModules.d.ts +1 -1
- package/Libraries/BatchedBridge/NativeModules.js +1 -0
- package/Libraries/Blob/Blob.js +4 -0
- package/Libraries/Blob/FileReader.js +30 -2
- package/Libraries/Blob/URL.js +3 -1
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +2 -2
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +2 -3
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.win32.js +2 -3
- package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +6 -4
- package/Libraries/Components/Button.js +3 -2
- package/Libraries/Components/Button.win32.js +451 -0
- package/Libraries/Components/Clipboard/Clipboard.js +1 -1
- package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +4 -0
- package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +1 -0
- package/Libraries/Components/Pressable/Pressable.d.ts +1 -1
- package/Libraries/Components/Pressable/Pressable.js +1 -1
- package/Libraries/Components/RefreshControl/RefreshControl.js +1 -0
- package/Libraries/Components/SafeAreaView/SafeAreaView.js +1 -2
- package/Libraries/Components/SafeAreaView/SafeAreaView.win32.js +1 -2
- package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +12 -6
- package/Libraries/Components/ScrollView/ScrollView.d.ts +2 -2
- package/Libraries/Components/ScrollView/ScrollView.js +149 -91
- package/Libraries/Components/ScrollView/ScrollView.win32.js +1939 -0
- package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +16 -6
- package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +5 -7
- package/Libraries/Components/ScrollView/ScrollViewViewConfig.js +1 -1
- package/Libraries/Components/StatusBar/StatusBar.js +3 -0
- package/Libraries/Components/Switch/Switch.js +3 -1
- package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +21 -11
- package/Libraries/Components/TextInput/InputAccessoryView.d.ts +1 -1
- package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +11 -5
- package/Libraries/Components/TextInput/TextInput.Types.win32.d.ts +51 -0
- package/Libraries/Components/TextInput/TextInput.Types.win32.js +3 -0
- package/Libraries/Components/TextInput/TextInput.Types.win32.js.map +1 -0
- package/Libraries/Components/TextInput/TextInput.d.ts +15 -5
- package/Libraries/Components/TextInput/TextInput.flow.js +1 -1
- package/Libraries/Components/TextInput/TextInput.js +130 -103
- package/Libraries/Components/TextInput/TextInput.win32.js +202 -890
- package/Libraries/Components/Touchable/Touchable.d.ts +1 -1
- package/Libraries/Components/Touchable/Touchable.flow.js +30 -4
- package/Libraries/Components/Touchable/Touchable.js +6 -3
- package/Libraries/Components/Touchable/Touchable.win32.js +6 -3
- package/Libraries/Components/Touchable/TouchableHighlight.js +1 -1
- package/Libraries/Components/Touchable/TouchableNativeFeedback.js +2 -2
- package/Libraries/Components/Touchable/TouchableOpacity.js +3 -0
- package/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts +1 -1
- package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +2 -2
- package/Libraries/Components/TraceUpdateOverlay/TraceUpdateOverlay.js +189 -0
- package/Libraries/Components/TraceUpdateOverlay/TraceUpdateOverlayNativeComponent.js +43 -0
- package/Libraries/Components/View/ReactNativeStyleAttributes.js +26 -0
- package/Libraries/Components/View/View.js +71 -45
- package/Libraries/Components/View/View.win32.js +38 -16
- package/Libraries/Components/View/ViewAccessibility.d.ts +6 -6
- package/Libraries/Components/View/ViewAccessibility.js +10 -1
- package/Libraries/Components/View/ViewAccessibility.win32.d.ts +5 -5
- package/Libraries/Components/View/ViewNativeComponent.js +32 -8
- package/Libraries/Components/View/ViewPropTypes.d.ts +1 -1
- package/Libraries/Components/View/ViewPropTypes.js +1 -1
- package/Libraries/Components/View/ViewPropTypes.win32.d.ts +1 -1
- package/Libraries/Components/View/ViewPropTypes.win32.js +1 -1
- package/Libraries/Components/View/ViewWin32.js +3 -3
- package/Libraries/Core/Devtools/openFileInEditor.js +1 -0
- package/Libraries/Core/Devtools/openURLInBrowser.js +1 -0
- package/Libraries/Core/Devtools/parseErrorStack.js +2 -2
- package/Libraries/Core/Devtools/parseHermesStack.js +54 -34
- package/Libraries/Core/ExceptionsManager.js +2 -2
- package/Libraries/Core/InitializeCore.js +2 -1
- package/Libraries/Core/ReactNativeVersion.js +3 -3
- package/Libraries/Core/ReactNativeVersionCheck.js +1 -9
- package/Libraries/Core/ReactNativeVersionCheck.win32.js +1 -9
- package/Libraries/Core/Timers/JSTimers.js +1 -1
- package/Libraries/Core/Timers/immediateShim.js +1 -0
- package/Libraries/Core/Timers/queueMicrotask.js +1 -1
- package/Libraries/Core/setUpAlert.js +1 -1
- package/Libraries/Core/setUpDOM.js +18 -0
- package/Libraries/Core/setUpDeveloperTools.js +1 -1
- package/Libraries/Core/setUpGlobals.js +5 -2
- package/Libraries/Core/setUpNavigator.js +6 -5
- package/Libraries/Core/setUpPerformance.js +23 -13
- package/Libraries/Core/setUpReactDevTools.js +2 -0
- package/Libraries/Core/setUpSegmentFetcher.js +0 -41
- package/Libraries/Core/setUpTimers.js +2 -2
- package/Libraries/DOM/Geometry/DOMRect.js +82 -0
- package/Libraries/DOM/Geometry/DOMRectReadOnly.js +188 -0
- package/Libraries/DOM/Nodes/ReactNativeElement.js +75 -0
- package/Libraries/DOM/Nodes/ReadOnlyElement.js +89 -0
- package/Libraries/DOM/Nodes/ReadOnlyNode.js +167 -0
- package/Libraries/DOM/OldStyleCollections/ArrayLikeUtils.js +46 -0
- package/Libraries/DOM/OldStyleCollections/DOMRectList.js +76 -0
- package/Libraries/DOM/OldStyleCollections/HTMLCollection.js +82 -0
- package/Libraries/DOM/OldStyleCollections/NodeList.js +104 -0
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.android.js +35 -0
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts +20 -0
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.ios.js +49 -0
- package/Libraries/DevToolsSettings/DevToolsSettingsManager.win32.js +35 -0
- package/Libraries/{Utilities/NativeDevSplitBundleLoader.js → DevToolsSettings/NativeDevToolsSettingsManager.js} +7 -2
- package/Libraries/EventEmitter/NativeEventEmitter.d.ts +1 -2
- package/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts +1 -2
- package/Libraries/EventEmitter/RCTDeviceEventEmitter.js +9 -1
- package/Libraries/Events/EventPolyfill.js +1 -1
- package/Libraries/Image/AssetRegistry.js +1 -1
- package/Libraries/Image/AssetSourceResolver.js +3 -3
- package/Libraries/Image/Image.android.js +4 -1
- package/Libraries/Image/Image.d.ts +63 -2
- package/Libraries/Image/Image.ios.js +3 -0
- package/Libraries/Image/Image.win32.js +3 -0
- package/Libraries/Image/ImageBackground.js +1 -0
- package/Libraries/Image/ImageProps.js +1 -1
- package/Libraries/Image/ImageViewNativeComponent.js +4 -4
- package/Libraries/Image/RelativeImageStub.js +1 -1
- package/Libraries/Image/TextInlineImageNativeComponent.js +1 -1
- package/Libraries/Image/resolveAssetSource.js +1 -1
- package/Libraries/Inspector/DevtoolsOverlay.js +29 -19
- package/Libraries/Inspector/ElementBox.js +4 -1
- package/Libraries/Inspector/Inspector.js +5 -6
- package/Libraries/Inspector/Inspector.win32.js +7 -6
- package/Libraries/Inspector/InspectorOverlay.js +3 -3
- package/Libraries/Inspector/InspectorOverlay.win32.js +2 -1
- package/Libraries/Inspector/NetworkOverlay.js +1 -1
- package/Libraries/Interaction/JSEventLoopWatchdog.js +1 -1
- package/Libraries/Interaction/PanResponder.js +5 -6
- package/Libraries/LayoutAnimation/LayoutAnimation.js +2 -1
- package/Libraries/Linking/Linking.js +1 -4
- package/Libraries/Lists/FillRateHelper.js +4 -238
- package/Libraries/Lists/FlatList.d.ts +15 -22
- package/Libraries/Lists/FlatList.js +9 -6
- package/Libraries/Lists/SectionList.d.ts +10 -6
- package/Libraries/Lists/SectionList.js +5 -3
- package/Libraries/Lists/SectionListModern.js +3 -3
- package/Libraries/Lists/ViewabilityHelper.js +8 -344
- package/Libraries/Lists/VirtualizeUtils.js +4 -244
- package/Libraries/Lists/VirtualizedList.js +10 -1867
- package/Libraries/Lists/VirtualizedListContext.js +6 -104
- package/Libraries/Lists/VirtualizedSectionList.js +9 -602
- package/Libraries/Lists/__flowtests__/FlatList-flowtest.js +1 -0
- package/Libraries/Lists/__flowtests__/SectionList-flowtest.js +1 -1
- package/Libraries/LogBox/Data/LogBoxData.js +1 -1
- package/Libraries/LogBox/Data/parseLogBoxLog.js +1 -1
- package/Libraries/LogBox/LogBox.js +1 -1
- package/Libraries/LogBox/UI/LogBoxInspector.js +1 -3
- package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.win32.js +168 -0
- package/Libraries/LogBox/UI/LogBoxInspectorHeader.win32.js +3 -0
- package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.win32.js +193 -0
- package/Libraries/LogBox/UI/LogBoxInspectorSourceMapStatus.js +1 -0
- package/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js +2 -2
- package/Libraries/LogBox/UI/LogBoxInspectorStackFrame.win32.js +7 -3
- package/Libraries/LogBox/UI/LogBoxMessage.js +87 -5
- package/Libraries/LogBox/UI/LogBoxNotification.js +5 -7
- package/Libraries/Modal/Modal.js +2 -2
- package/Libraries/NativeComponent/BaseViewConfig.android.js +32 -12
- package/Libraries/NativeComponent/BaseViewConfig.ios.js +43 -19
- package/Libraries/NativeComponent/BaseViewConfig.win32.js +43 -19
- package/Libraries/NativeComponent/NativeComponentRegistryUnstable.js +4 -1
- package/Libraries/NativeComponent/ViewConfig.js +1 -0
- package/Libraries/NativeComponent/ViewConfigIgnore.js +1 -4
- package/Libraries/Network/RCTNetworking.android.js +2 -2
- package/Libraries/Network/RCTNetworking.ios.js +1 -1
- package/Libraries/Network/RCTNetworking.win32.js +1 -1
- package/Libraries/Network/XMLHttpRequest.js +1 -1
- package/Libraries/Pressability/Pressability.js +11 -5
- package/Libraries/Pressability/Pressability.win32.js +9 -3
- package/Libraries/ReactNative/AppContainer.js +7 -1
- package/Libraries/ReactNative/AppRegistry.d.ts +1 -1
- package/Libraries/ReactNative/AppRegistry.js +10 -13
- package/Libraries/ReactNative/FabricUIManager.js +24 -8
- package/Libraries/ReactNative/NativeUIManager.js +5 -5
- package/Libraries/ReactNative/ReactNativeFeatureFlags.js +10 -10
- package/Libraries/ReactNative/UIManager.js +142 -1
- package/Libraries/ReactNative/getCachedComponentWithDebugName.js +5 -5
- package/Libraries/ReactNative/getNativeComponentAttributes.js +1 -1
- package/Libraries/ReactNative/requireNativeComponent.d.ts +1 -1
- package/Libraries/ReactNative/requireNativeComponent.js +1 -1
- package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +1 -0
- package/Libraries/Renderer/implementations/ReactFabric-dev.js +26 -3
- package/Libraries/Renderer/implementations/ReactFabric-prod.js +13 -1
- package/Libraries/Renderer/implementations/ReactFabric-profiling.js +13 -1
- package/Libraries/Renderer/public/ReactFabricPublicInstanceUtils.js +38 -0
- package/Libraries/Renderer/shims/ReactNativeTypes.js +38 -20
- package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +7 -7
- package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
- package/Libraries/Share/Share.js +1 -1
- package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +1 -1
- package/Libraries/StyleSheet/StyleSheet.js +1 -1
- package/Libraries/StyleSheet/StyleSheet.win32.js +1 -1
- package/Libraries/StyleSheet/StyleSheetTypes.d.ts +115 -76
- package/Libraries/StyleSheet/StyleSheetTypes.js +188 -33
- package/Libraries/StyleSheet/flattenStyle.js +2 -0
- package/Libraries/StyleSheet/normalizeColor.js +1 -1
- package/Libraries/StyleSheet/processColor.js +1 -1
- package/Libraries/Text/Text.d.ts +12 -2
- package/Libraries/Text/Text.js +50 -41
- package/Libraries/Text/TextProps.js +3 -4
- package/Libraries/TurboModule/samples/NativeSampleTurboModule.js +6 -0
- package/Libraries/Types/CodegenTypes.js +1 -0
- package/Libraries/UTFSequence.js +3 -1
- package/Libraries/Utilities/Appearance.d.ts +10 -0
- package/Libraries/Utilities/Appearance.js +13 -0
- package/Libraries/Utilities/Dimensions.js +1 -1
- package/Libraries/Utilities/Dimensions.win32.js +1 -1
- package/Libraries/Utilities/GlobalPerformanceLogger.js +12 -1
- package/Libraries/Utilities/HMRClient.js +16 -10
- package/Libraries/Utilities/{createPerformanceLogger.d.ts → IPerformanceLogger.d.ts} +4 -4
- package/Libraries/Utilities/IPerformanceLogger.js +49 -0
- package/Libraries/Utilities/LoadingView.android.js +28 -11
- package/Libraries/Utilities/NativeAppearance.js +1 -0
- package/Libraries/Utilities/NativePlatformConstantsWin.js +1 -1
- package/Libraries/Utilities/PixelRatio.js +2 -2
- package/Libraries/Utilities/Platform.win32.js +1 -1
- package/Libraries/Utilities/ReactNativeTestTools.js +1 -1
- package/Libraries/Utilities/__mocks__/PixelRatio.js +1 -1
- package/Libraries/Utilities/codegenNativeCommands.js +2 -0
- package/Libraries/Utilities/createPerformanceLogger.js +55 -43
- package/Libraries/Utilities/stringifySafe.js +2 -7
- package/Libraries/Utilities/useColorScheme.js +1 -1
- package/Libraries/Utilities/useWindowDimensions.js +3 -3
- package/Libraries/WebPerformance/EventCounts.js +78 -0
- package/Libraries/WebPerformance/MemoryInfo.js +54 -0
- package/Libraries/WebPerformance/NativePerformance.js +38 -0
- package/Libraries/WebPerformance/NativePerformanceObserver.js +22 -7
- package/Libraries/WebPerformance/Performance.js +312 -0
- package/Libraries/WebPerformance/PerformanceEntry.js +45 -0
- package/Libraries/WebPerformance/PerformanceEventTiming.js +38 -0
- package/Libraries/WebPerformance/PerformanceObserver.js +196 -101
- package/Libraries/WebPerformance/RawPerformanceEntry.js +87 -0
- package/Libraries/WebPerformance/ReactNativeStartupTiming.js +65 -0
- package/Libraries/WebPerformance/__mocks__/NativePerformance.js +65 -0
- package/Libraries/WebPerformance/__mocks__/NativePerformanceObserver.js +101 -0
- package/Libraries/YellowBox/YellowBoxDeprecated.js +1 -1
- package/Libraries/vendor/core/ErrorUtils.js +1 -1
- package/Libraries/vendor/emitter/EventEmitter.d.ts +2 -2
- package/Libraries/vendor/emitter/EventEmitter.js +9 -1
- package/flow/global.js +29 -4
- package/flow/jest.js +258 -164
- package/index.js +56 -42
- package/index.win32.js +56 -42
- package/interface.js +1 -1
- package/jest/local-setup.js +33 -0
- package/jest/mockComponent.js +4 -2
- package/jest/mockNativeComponent.js +1 -1
- package/jest/mockScrollView.js +2 -1
- package/jest/react-native-env.js +1 -3
- package/jest/setup.js +11 -8
- package/overrides.json +115 -85
- package/package.json +38 -28
- package/rn-get-polyfills.js +1 -1
- package/src/Libraries/Components/TextInput/TextInput.Types.win32.ts +68 -0
- package/src/Libraries/Components/View/ViewAccessibility.win32.d.ts +5 -5
- package/src/Libraries/Components/View/ViewPropTypes.win32.d.ts +1 -1
- package/types/index.d.ts +2 -6
- package/types/modules/Codegen.d.ts +4 -4
- package/types/modules/globals.d.ts +27 -25
- package/types/public/DeprecatedPropertiesAlias.d.ts +0 -20
- package/types/public/ReactNativeRenderer.d.ts +2 -7
- package/Libraries/Animated/createAnimatedComponentInjection.js +0 -48
- package/Libraries/Animated/createAnimatedComponent_EXPERIMENTAL.js +0 -48
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.flow.js +0 -208
- package/Libraries/Components/ActivityIndicator/ActivityIndicator.flow.js +0 -58
- package/Libraries/Components/DatePicker/DatePickerIOS.android.js +0 -47
- package/Libraries/Components/DatePicker/DatePickerIOS.d.ts +0 -92
- package/Libraries/Components/DatePicker/DatePickerIOS.flow.android.js +0 -14
- package/Libraries/Components/DatePicker/DatePickerIOS.flow.ios.js +0 -113
- package/Libraries/Components/DatePicker/DatePickerIOS.ios.js +0 -242
- package/Libraries/Components/DatePicker/DatePickerIOS.win32.js +0 -47
- package/Libraries/Components/DatePicker/RCTDatePickerNativeComponent.js +0 -60
- package/Libraries/Components/DatePickerAndroid/NativeDatePickerAndroid.js +0 -26
- package/Libraries/Components/ProgressViewIOS/ProgressViewIOS.android.js +0 -45
- package/Libraries/Components/ProgressViewIOS/ProgressViewIOS.d.ts +0 -62
- package/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js +0 -75
- package/Libraries/Components/ProgressViewIOS/ProgressViewIOS.win32.js +0 -45
- package/Libraries/Components/ProgressViewIOS/RCTProgressViewNativeComponent.js +0 -33
- package/Libraries/Components/SafeAreaView/SafeAreaView.flow.js +0 -19
- package/Libraries/Components/Slider/Slider.d.ts +0 -132
- package/Libraries/Components/Slider/Slider.js +0 -282
- package/Libraries/Components/Slider/SliderNativeComponent.js +0 -56
- package/Libraries/Components/TextInput/Win32TextInputNativeComponent.js +0 -23
- package/Libraries/Interaction/Batchinator.js +0 -76
- package/Libraries/Interaction/BridgeSpyStallHandler.js +0 -63
- package/Libraries/Interaction/InteractionStallDebugger.js +0 -23
- package/Libraries/Interaction/PanResponder.flow.js +0 -257
- package/Libraries/Lists/CellRenderMask.js +0 -155
- package/Libraries/Lists/ChildListCollection.js +0 -72
- package/Libraries/Lists/StateSafePureComponent.js +0 -85
- package/Libraries/Lists/VirtualizedList.d.ts +0 -347
- package/Libraries/Lists/VirtualizedListCellRenderer.js +0 -259
- package/Libraries/Lists/VirtualizedListProps.js +0 -279
- package/Libraries/Performance/PureComponentDebug.js +0 -74
- package/Libraries/Reliability/UserFlow.js +0 -158
- package/Libraries/Renderer/implementations/ReactNativeRenderer.d.ts +0 -149
- package/Libraries/Renderer/shims/ReactNativeTypes.d.ts +0 -141
- package/Libraries/Utilities/MatrixMath.js +0 -748
- package/Libraries/Utilities/buildStyleInterpolator.js +0 -209
- package/Libraries/Utilities/clamp.js +0 -23
- package/Libraries/Utilities/deprecatedPropType.js +0 -36
- package/Libraries/Utilities/groupByEveryN.js +0 -51
- package/Libraries/Utilities/mergeIntoFast.js +0 -26
- package/Libraries/Utilities/setAndForwardRef.js +0 -71
- package/Libraries/Utilities/truncate.js +0 -51
- package/flow/JSITimerInternalType.js +0 -30
- package/flow/use-sync-external-store.js +0 -19
|
@@ -8,62 +8,15 @@
|
|
|
8
8
|
* @flow strict
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import type {
|
|
12
|
-
RawPerformanceEntry,
|
|
13
|
-
RawPerformanceEntryType,
|
|
14
|
-
} from './NativePerformanceObserver';
|
|
11
|
+
import type {HighResTimeStamp, PerformanceEntryType} from './PerformanceEntry';
|
|
15
12
|
|
|
16
13
|
import warnOnce from '../Utilities/warnOnce';
|
|
17
14
|
import NativePerformanceObserver from './NativePerformanceObserver';
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
export class PerformanceEntry {
|
|
25
|
-
name: string;
|
|
26
|
-
entryType: PerformanceEntryType;
|
|
27
|
-
startTime: HighResTimeStamp;
|
|
28
|
-
duration: number;
|
|
29
|
-
|
|
30
|
-
constructor(init: {
|
|
31
|
-
name: string,
|
|
32
|
-
entryType: PerformanceEntryType,
|
|
33
|
-
startTime: HighResTimeStamp,
|
|
34
|
-
duration: number,
|
|
35
|
-
}) {
|
|
36
|
-
this.name = init.name;
|
|
37
|
-
this.entryType = init.entryType;
|
|
38
|
-
this.startTime = init.startTime;
|
|
39
|
-
this.duration = init.duration;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// $FlowIgnore: Flow(unclear-type)
|
|
43
|
-
toJSON(): Object {
|
|
44
|
-
return {
|
|
45
|
-
name: this.name,
|
|
46
|
-
entryType: this.entryType,
|
|
47
|
-
startTime: this.startTime,
|
|
48
|
-
duration: this.duration,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function rawToPerformanceEntryType(
|
|
54
|
-
type: RawPerformanceEntryType,
|
|
55
|
-
): PerformanceEntryType {
|
|
56
|
-
return 'undefined';
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function rawToPerformanceEntry(entry: RawPerformanceEntry): PerformanceEntry {
|
|
60
|
-
return new PerformanceEntry({
|
|
61
|
-
name: entry.name,
|
|
62
|
-
entryType: rawToPerformanceEntryType(entry.entryType),
|
|
63
|
-
startTime: entry.startTime,
|
|
64
|
-
duration: entry.duration,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
15
|
+
import {PerformanceEntry} from './PerformanceEntry';
|
|
16
|
+
import {
|
|
17
|
+
performanceEntryTypeToRaw,
|
|
18
|
+
rawToPerformanceEntry,
|
|
19
|
+
} from './RawPerformanceEntry';
|
|
67
20
|
|
|
68
21
|
export type PerformanceEntryList = $ReadOnlyArray<PerformanceEntry>;
|
|
69
22
|
|
|
@@ -99,6 +52,8 @@ export class PerformanceObserverEntryList {
|
|
|
99
52
|
export type PerformanceObserverCallback = (
|
|
100
53
|
list: PerformanceObserverEntryList,
|
|
101
54
|
observer: PerformanceObserver,
|
|
55
|
+
// The number of buffered entries which got dropped from the buffer due to the buffer being full:
|
|
56
|
+
droppedEntryCount?: number,
|
|
102
57
|
) => void;
|
|
103
58
|
|
|
104
59
|
export type PerformanceObserverInit =
|
|
@@ -107,21 +62,73 @@ export type PerformanceObserverInit =
|
|
|
107
62
|
}
|
|
108
63
|
| {
|
|
109
64
|
type: PerformanceEntryType,
|
|
65
|
+
durationThreshold?: HighResTimeStamp,
|
|
110
66
|
};
|
|
111
67
|
|
|
112
|
-
|
|
68
|
+
type PerformanceObserverConfig = {|
|
|
69
|
+
callback: PerformanceObserverCallback,
|
|
70
|
+
// Map of {entryType: durationThreshold}
|
|
71
|
+
entryTypes: $ReadOnlyMap<PerformanceEntryType, ?number>,
|
|
72
|
+
|};
|
|
113
73
|
|
|
114
|
-
|
|
74
|
+
const observerCountPerEntryType: Map<PerformanceEntryType, number> = new Map();
|
|
75
|
+
const registeredObservers: Map<PerformanceObserver, PerformanceObserverConfig> =
|
|
76
|
+
new Map();
|
|
77
|
+
let isOnPerformanceEntryCallbackSet: boolean = false;
|
|
115
78
|
|
|
116
|
-
|
|
79
|
+
// This is a callback that gets scheduled and periodically called from the native side
|
|
80
|
+
const onPerformanceEntry = () => {
|
|
81
|
+
if (!NativePerformanceObserver) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const entryResult = NativePerformanceObserver.popPendingEntries();
|
|
85
|
+
const rawEntries = entryResult?.entries ?? [];
|
|
86
|
+
const droppedEntriesCount = entryResult?.droppedEntriesCount;
|
|
87
|
+
if (rawEntries.length === 0) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const entries = rawEntries.map(rawToPerformanceEntry);
|
|
91
|
+
for (const [observer, observerConfig] of registeredObservers.entries()) {
|
|
92
|
+
const entriesForObserver: PerformanceEntryList = entries.filter(entry => {
|
|
93
|
+
if (!observerConfig.entryTypes.has(entry.entryType)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
const durationThreshold = observerConfig.entryTypes.get(entry.entryType);
|
|
97
|
+
return entry.duration >= (durationThreshold ?? 0);
|
|
98
|
+
});
|
|
99
|
+
observerConfig.callback(
|
|
100
|
+
new PerformanceObserverEntryList(entriesForObserver),
|
|
101
|
+
observer,
|
|
102
|
+
droppedEntriesCount,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
117
106
|
|
|
118
|
-
function warnNoNativePerformanceObserver() {
|
|
107
|
+
export function warnNoNativePerformanceObserver() {
|
|
119
108
|
warnOnce(
|
|
120
109
|
'missing-native-performance-observer',
|
|
121
110
|
'Missing native implementation of PerformanceObserver',
|
|
122
111
|
);
|
|
123
112
|
}
|
|
124
113
|
|
|
114
|
+
function applyDurationThresholds() {
|
|
115
|
+
const durationThresholds: Map<PerformanceEntryType, ?number> = Array.from(
|
|
116
|
+
registeredObservers.values(),
|
|
117
|
+
)
|
|
118
|
+
.map(config => config.entryTypes)
|
|
119
|
+
.reduce(
|
|
120
|
+
(accumulator, currentValue) => union(accumulator, currentValue),
|
|
121
|
+
new Map(),
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
for (const [entryType, durationThreshold] of durationThresholds) {
|
|
125
|
+
NativePerformanceObserver?.setDurationThreshold(
|
|
126
|
+
performanceEntryTypeToRaw(entryType),
|
|
127
|
+
durationThreshold ?? 0,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
125
132
|
/**
|
|
126
133
|
* Implementation of the PerformanceObserver interface for RN,
|
|
127
134
|
* corresponding to the standard in https://www.w3.org/TR/performance-timeline/
|
|
@@ -144,38 +151,77 @@ function warnNoNativePerformanceObserver() {
|
|
|
144
151
|
*/
|
|
145
152
|
export default class PerformanceObserver {
|
|
146
153
|
_callback: PerformanceObserverCallback;
|
|
147
|
-
|
|
154
|
+
_type: 'single' | 'multiple' | void;
|
|
148
155
|
|
|
149
156
|
constructor(callback: PerformanceObserverCallback) {
|
|
150
157
|
this._callback = callback;
|
|
151
158
|
}
|
|
152
159
|
|
|
153
|
-
observe(options: PerformanceObserverInit) {
|
|
160
|
+
observe(options: PerformanceObserverInit): void {
|
|
154
161
|
if (!NativePerformanceObserver) {
|
|
155
162
|
warnNoNativePerformanceObserver();
|
|
156
163
|
return;
|
|
157
164
|
}
|
|
158
|
-
|
|
165
|
+
|
|
166
|
+
this._validateObserveOptions(options);
|
|
167
|
+
|
|
168
|
+
let requestedEntryTypes;
|
|
169
|
+
|
|
170
|
+
if (options.entryTypes) {
|
|
171
|
+
this._type = 'multiple';
|
|
172
|
+
requestedEntryTypes = new Map(
|
|
173
|
+
options.entryTypes.map(t => [t, undefined]),
|
|
174
|
+
);
|
|
175
|
+
} else {
|
|
176
|
+
this._type = 'single';
|
|
177
|
+
requestedEntryTypes = new Map([
|
|
178
|
+
[options.type, options.durationThreshold],
|
|
179
|
+
]);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// The same observer may receive multiple calls to "observe", so we need
|
|
183
|
+
// to check what is new on this call vs. previous ones.
|
|
184
|
+
const currentEntryTypes = registeredObservers.get(this)?.entryTypes;
|
|
185
|
+
const nextEntryTypes = currentEntryTypes
|
|
186
|
+
? union(requestedEntryTypes, currentEntryTypes)
|
|
187
|
+
: requestedEntryTypes;
|
|
188
|
+
|
|
189
|
+
// This `observe` call is a no-op because there are no new things to observe.
|
|
190
|
+
if (currentEntryTypes && currentEntryTypes.size === nextEntryTypes.size) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
registeredObservers.set(this, {
|
|
195
|
+
callback: this._callback,
|
|
196
|
+
entryTypes: nextEntryTypes,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
if (!isOnPerformanceEntryCallbackSet) {
|
|
159
200
|
NativePerformanceObserver.setOnPerformanceEntryCallback(
|
|
160
201
|
onPerformanceEntry,
|
|
161
202
|
);
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
if (options.entryTypes) {
|
|
165
|
-
this._entryTypes = new Set(options.entryTypes);
|
|
166
|
-
} else {
|
|
167
|
-
this._entryTypes = new Set([options.type]);
|
|
203
|
+
isOnPerformanceEntryCallbackSet = true;
|
|
168
204
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
205
|
+
|
|
206
|
+
// We only need to start listenening to new entry types being observed in
|
|
207
|
+
// this observer.
|
|
208
|
+
const newEntryTypes = currentEntryTypes
|
|
209
|
+
? difference(
|
|
210
|
+
new Set(requestedEntryTypes.keys()),
|
|
211
|
+
new Set(currentEntryTypes.keys()),
|
|
212
|
+
)
|
|
213
|
+
: new Set(requestedEntryTypes.keys());
|
|
214
|
+
for (const type of newEntryTypes) {
|
|
215
|
+
if (!observerCountPerEntryType.has(type)) {
|
|
216
|
+
const rawType = performanceEntryTypeToRaw(type);
|
|
217
|
+
NativePerformanceObserver.startReporting(rawType);
|
|
172
218
|
}
|
|
173
|
-
|
|
219
|
+
observerCountPerEntryType.set(
|
|
174
220
|
type,
|
|
175
|
-
(
|
|
221
|
+
(observerCountPerEntryType.get(type) ?? 0) + 1,
|
|
176
222
|
);
|
|
177
|
-
}
|
|
178
|
-
|
|
223
|
+
}
|
|
224
|
+
applyDurationThresholds();
|
|
179
225
|
}
|
|
180
226
|
|
|
181
227
|
disconnect(): void {
|
|
@@ -183,41 +229,90 @@ export default class PerformanceObserver {
|
|
|
183
229
|
warnNoNativePerformanceObserver();
|
|
184
230
|
return;
|
|
185
231
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
232
|
+
|
|
233
|
+
const observerConfig = registeredObservers.get(this);
|
|
234
|
+
if (!observerConfig) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Disconnect this observer
|
|
239
|
+
for (const type of observerConfig.entryTypes.keys()) {
|
|
240
|
+
const numberOfObserversForThisType =
|
|
241
|
+
observerCountPerEntryType.get(type) ?? 0;
|
|
242
|
+
if (numberOfObserversForThisType === 1) {
|
|
243
|
+
observerCountPerEntryType.delete(type);
|
|
244
|
+
NativePerformanceObserver.stopReporting(
|
|
245
|
+
performanceEntryTypeToRaw(type),
|
|
246
|
+
);
|
|
247
|
+
} else if (numberOfObserversForThisType !== 0) {
|
|
248
|
+
observerCountPerEntryType.set(type, numberOfObserversForThisType - 1);
|
|
193
249
|
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Disconnect all observers if this was the last one
|
|
253
|
+
registeredObservers.delete(this);
|
|
254
|
+
if (registeredObservers.size === 0) {
|
|
197
255
|
NativePerformanceObserver.setOnPerformanceEntryCallback(undefined);
|
|
198
|
-
|
|
256
|
+
isOnPerformanceEntryCallbackSet = false;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
applyDurationThresholds();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
_validateObserveOptions(options: PerformanceObserverInit): void {
|
|
263
|
+
const {type, entryTypes, durationThreshold} = options;
|
|
264
|
+
|
|
265
|
+
if (!type && !entryTypes) {
|
|
266
|
+
throw new TypeError(
|
|
267
|
+
"Failed to execute 'observe' on 'PerformanceObserver': An observe() call must not include both entryTypes and type arguments.",
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (entryTypes && type) {
|
|
272
|
+
throw new TypeError(
|
|
273
|
+
"Failed to execute 'observe' on 'PerformanceObserver': An observe() call must include either entryTypes or type arguments.",
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (this._type === 'multiple' && type) {
|
|
278
|
+
throw new Error(
|
|
279
|
+
"Failed to execute 'observe' on 'PerformanceObserver': This observer has performed observe({entryTypes:...}, therefore it cannot perform observe({type:...})",
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (this._type === 'single' && entryTypes) {
|
|
284
|
+
throw new Error(
|
|
285
|
+
"Failed to execute 'observe' on 'PerformanceObserver': This PerformanceObserver has performed observe({type:...}, therefore it cannot perform observe({entryTypes:...})",
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (entryTypes && durationThreshold !== undefined) {
|
|
290
|
+
throw new TypeError(
|
|
291
|
+
"Failed to execute 'observe' on 'PerformanceObserver': An observe() call must not include both entryTypes and durationThreshold arguments.",
|
|
292
|
+
);
|
|
199
293
|
}
|
|
200
294
|
}
|
|
201
295
|
|
|
202
296
|
static supportedEntryTypes: $ReadOnlyArray<PerformanceEntryType> =
|
|
203
|
-
|
|
204
|
-
Object.freeze([]);
|
|
297
|
+
Object.freeze(['mark', 'measure', 'event']);
|
|
205
298
|
}
|
|
206
299
|
|
|
207
|
-
//
|
|
208
|
-
function
|
|
209
|
-
|
|
210
|
-
|
|
300
|
+
// As a Set union, except if value exists in both, we take minimum
|
|
301
|
+
function union<T>(
|
|
302
|
+
a: $ReadOnlyMap<T, ?number>,
|
|
303
|
+
b: $ReadOnlyMap<T, ?number>,
|
|
304
|
+
): Map<T, ?number> {
|
|
305
|
+
const res = new Map<T, ?number>();
|
|
306
|
+
for (const [k, v] of a) {
|
|
307
|
+
if (!b.has(k)) {
|
|
308
|
+
res.set(k, v);
|
|
309
|
+
} else {
|
|
310
|
+
res.set(k, Math.min(v ?? 0, b.get(k) ?? 0));
|
|
311
|
+
}
|
|
211
312
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
);
|
|
218
|
-
observer._callback(
|
|
219
|
-
new PerformanceObserverEntryList(entriesForObserver),
|
|
220
|
-
observer,
|
|
221
|
-
);
|
|
222
|
-
});
|
|
313
|
+
return res;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function difference<T>(a: $ReadOnlySet<T>, b: $ReadOnlySet<T>): Set<T> {
|
|
317
|
+
return new Set([...a].filter(x => !b.has(x)));
|
|
223
318
|
}
|
|
@@ -0,0 +1,87 @@
|
|
|
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 type {
|
|
12
|
+
RawPerformanceEntry,
|
|
13
|
+
RawPerformanceEntryType,
|
|
14
|
+
} from './NativePerformanceObserver';
|
|
15
|
+
import type {PerformanceEntryType} from './PerformanceEntry';
|
|
16
|
+
|
|
17
|
+
import {PerformanceEntry} from './PerformanceEntry';
|
|
18
|
+
import {PerformanceEventTiming} from './PerformanceEventTiming';
|
|
19
|
+
|
|
20
|
+
export const RawPerformanceEntryTypeValues = {
|
|
21
|
+
UNDEFINED: 0,
|
|
22
|
+
MARK: 1,
|
|
23
|
+
MEASURE: 2,
|
|
24
|
+
EVENT: 3,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export function rawToPerformanceEntry(
|
|
28
|
+
entry: RawPerformanceEntry,
|
|
29
|
+
): PerformanceEntry {
|
|
30
|
+
if (entry.entryType === RawPerformanceEntryTypeValues.EVENT) {
|
|
31
|
+
return new PerformanceEventTiming({
|
|
32
|
+
name: entry.name,
|
|
33
|
+
startTime: entry.startTime,
|
|
34
|
+
duration: entry.duration,
|
|
35
|
+
processingStart: entry.processingStart,
|
|
36
|
+
processingEnd: entry.processingEnd,
|
|
37
|
+
interactionId: entry.interactionId,
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
return new PerformanceEntry({
|
|
41
|
+
name: entry.name,
|
|
42
|
+
entryType: rawToPerformanceEntryType(entry.entryType),
|
|
43
|
+
startTime: entry.startTime,
|
|
44
|
+
duration: entry.duration,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function rawToPerformanceEntryType(
|
|
50
|
+
type: RawPerformanceEntryType,
|
|
51
|
+
): PerformanceEntryType {
|
|
52
|
+
switch (type) {
|
|
53
|
+
case RawPerformanceEntryTypeValues.MARK:
|
|
54
|
+
return 'mark';
|
|
55
|
+
case RawPerformanceEntryTypeValues.MEASURE:
|
|
56
|
+
return 'measure';
|
|
57
|
+
case RawPerformanceEntryTypeValues.EVENT:
|
|
58
|
+
return 'event';
|
|
59
|
+
case RawPerformanceEntryTypeValues.UNDEFINED:
|
|
60
|
+
throw new TypeError(
|
|
61
|
+
"rawToPerformanceEntryType: UNDEFINED can't be cast to PerformanceEntryType",
|
|
62
|
+
);
|
|
63
|
+
default:
|
|
64
|
+
throw new TypeError(
|
|
65
|
+
`rawToPerformanceEntryType: unexpected performance entry type received: ${type}`,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function performanceEntryTypeToRaw(
|
|
71
|
+
type: PerformanceEntryType,
|
|
72
|
+
): RawPerformanceEntryType {
|
|
73
|
+
switch (type) {
|
|
74
|
+
case 'mark':
|
|
75
|
+
return RawPerformanceEntryTypeValues.MARK;
|
|
76
|
+
case 'measure':
|
|
77
|
+
return RawPerformanceEntryTypeValues.MEASURE;
|
|
78
|
+
case 'event':
|
|
79
|
+
return RawPerformanceEntryTypeValues.EVENT;
|
|
80
|
+
default:
|
|
81
|
+
// Verify exhaustive check with Flow
|
|
82
|
+
(type: empty);
|
|
83
|
+
throw new TypeError(
|
|
84
|
+
`performanceEntryTypeToRaw: unexpected performance entry type received: ${type}`,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
* @flow strict
|
|
8
|
+
* @format
|
|
9
|
+
* @oncall react_native
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// flowlint unsafe-getters-setters:off
|
|
13
|
+
|
|
14
|
+
import type {ReactNativeStartupTiming as ReactNativeStartupTimingType} from './NativePerformance';
|
|
15
|
+
|
|
16
|
+
// Read-only object with RN startup timing information.
|
|
17
|
+
// This is returned by the performance.reactNativeStartup API.
|
|
18
|
+
export default class ReactNativeStartupTiming {
|
|
19
|
+
// All time information here are in ms. To match web spec,
|
|
20
|
+
// the default value for timings are zero if not present.
|
|
21
|
+
// See https://www.w3.org/TR/performance-timeline/#performancetiming-interface
|
|
22
|
+
_startTime = 0;
|
|
23
|
+
_endTime = 0;
|
|
24
|
+
_executeJavaScriptBundleEntryPointStart = 0;
|
|
25
|
+
_executeJavaScriptBundleEntryPointEnd = 0;
|
|
26
|
+
|
|
27
|
+
constructor(startUpTiming: ?ReactNativeStartupTimingType) {
|
|
28
|
+
if (startUpTiming != null) {
|
|
29
|
+
this._startTime = startUpTiming.startTime;
|
|
30
|
+
this._endTime = startUpTiming.endTime;
|
|
31
|
+
this._executeJavaScriptBundleEntryPointStart =
|
|
32
|
+
startUpTiming.executeJavaScriptBundleEntryPointStart;
|
|
33
|
+
this._executeJavaScriptBundleEntryPointEnd =
|
|
34
|
+
startUpTiming.executeJavaScriptBundleEntryPointEnd;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Start time of the RN app startup process. This is provided by the platform by implementing the `ReactMarker.setAppStartTime` API in the native platform code.
|
|
40
|
+
*/
|
|
41
|
+
get startTime(): number {
|
|
42
|
+
return this._startTime;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* End time of the RN app startup process. This is equal to `executeJavaScriptBundleEntryPointEnd`.
|
|
47
|
+
*/
|
|
48
|
+
get endTime(): number {
|
|
49
|
+
return this._endTime;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Start time of JS bundle being executed. This indicates the RN JS bundle is loaded and start to be evaluated.
|
|
54
|
+
*/
|
|
55
|
+
get executeJavaScriptBundleEntryPointStart(): number {
|
|
56
|
+
return this._executeJavaScriptBundleEntryPointStart;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* End time of JS bundle being executed. This indicates all the synchronous entry point jobs are finished.
|
|
61
|
+
*/
|
|
62
|
+
get executeJavaScriptBundleEntryPointEnd(): number {
|
|
63
|
+
return this._executeJavaScriptBundleEntryPointEnd;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
* @flow strict
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {
|
|
12
|
+
NativeMemoryInfo,
|
|
13
|
+
ReactNativeStartupTiming,
|
|
14
|
+
Spec as NativePerformance,
|
|
15
|
+
} from '../NativePerformance';
|
|
16
|
+
|
|
17
|
+
import NativePerformanceObserver from '../NativePerformanceObserver';
|
|
18
|
+
import {RawPerformanceEntryTypeValues} from '../RawPerformanceEntry';
|
|
19
|
+
|
|
20
|
+
const marks: Map<string, number> = new Map();
|
|
21
|
+
|
|
22
|
+
const NativePerformanceMock: NativePerformance = {
|
|
23
|
+
mark: (name: string, startTime: number, duration: number): void => {
|
|
24
|
+
NativePerformanceObserver?.logRawEntry({
|
|
25
|
+
name,
|
|
26
|
+
entryType: RawPerformanceEntryTypeValues.MARK,
|
|
27
|
+
startTime,
|
|
28
|
+
duration,
|
|
29
|
+
});
|
|
30
|
+
marks.set(name, startTime);
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
measure: (
|
|
34
|
+
name: string,
|
|
35
|
+
startTime: number,
|
|
36
|
+
endTime: number,
|
|
37
|
+
duration?: number,
|
|
38
|
+
startMark?: string,
|
|
39
|
+
endMark?: string,
|
|
40
|
+
): void => {
|
|
41
|
+
const start = startMark != null ? marks.get(startMark) ?? 0 : startTime;
|
|
42
|
+
const end = endMark != null ? marks.get(endMark) ?? 0 : endTime;
|
|
43
|
+
NativePerformanceObserver?.logRawEntry({
|
|
44
|
+
name,
|
|
45
|
+
entryType: RawPerformanceEntryTypeValues.MEASURE,
|
|
46
|
+
startTime: start,
|
|
47
|
+
duration: duration ?? (end ? end - start : 0),
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
getSimpleMemoryInfo: (): NativeMemoryInfo => {
|
|
52
|
+
return {};
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
getReactNativeStartupTiming: (): ReactNativeStartupTiming => {
|
|
56
|
+
return {
|
|
57
|
+
startTime: 0,
|
|
58
|
+
endTime: 0,
|
|
59
|
+
executeJavaScriptBundleEntryPointStart: 0,
|
|
60
|
+
executeJavaScriptBundleEntryPointEnd: 0,
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export default NativePerformanceMock;
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
* @flow strict
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {
|
|
12
|
+
GetPendingEntriesResult,
|
|
13
|
+
RawPerformanceEntry,
|
|
14
|
+
RawPerformanceEntryType,
|
|
15
|
+
Spec as NativePerformanceObserver,
|
|
16
|
+
} from '../NativePerformanceObserver';
|
|
17
|
+
|
|
18
|
+
import {RawPerformanceEntryTypeValues} from '../RawPerformanceEntry';
|
|
19
|
+
|
|
20
|
+
const reportingType: Set<RawPerformanceEntryType> = new Set();
|
|
21
|
+
const eventCounts: Map<string, number> = new Map();
|
|
22
|
+
const durationThresholds: Map<RawPerformanceEntryType, number> = new Map();
|
|
23
|
+
let entries: Array<RawPerformanceEntry> = [];
|
|
24
|
+
let onPerformanceEntryCallback: ?() => void;
|
|
25
|
+
|
|
26
|
+
const NativePerformanceObserverMock: NativePerformanceObserver = {
|
|
27
|
+
startReporting: (entryType: RawPerformanceEntryType) => {
|
|
28
|
+
reportingType.add(entryType);
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
stopReporting: (entryType: RawPerformanceEntryType) => {
|
|
32
|
+
reportingType.delete(entryType);
|
|
33
|
+
durationThresholds.delete(entryType);
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
popPendingEntries: (): GetPendingEntriesResult => {
|
|
37
|
+
const res = entries;
|
|
38
|
+
entries = [];
|
|
39
|
+
return {
|
|
40
|
+
droppedEntriesCount: 0,
|
|
41
|
+
entries: res,
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
setOnPerformanceEntryCallback: (callback?: () => void) => {
|
|
46
|
+
onPerformanceEntryCallback = callback;
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
logRawEntry: (entry: RawPerformanceEntry) => {
|
|
50
|
+
if (reportingType.has(entry.entryType)) {
|
|
51
|
+
const durationThreshold = durationThresholds.get(entry.entryType);
|
|
52
|
+
if (
|
|
53
|
+
durationThreshold !== undefined &&
|
|
54
|
+
entry.duration < durationThreshold
|
|
55
|
+
) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
entries.push(entry);
|
|
59
|
+
// $FlowFixMe[incompatible-call]
|
|
60
|
+
global.queueMicrotask(() => {
|
|
61
|
+
// We want to emulate the way it's done in native (i.e. async/batched)
|
|
62
|
+
onPerformanceEntryCallback?.();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (entry.entryType === RawPerformanceEntryTypeValues.EVENT) {
|
|
66
|
+
eventCounts.set(entry.name, (eventCounts.get(entry.name) ?? 0) + 1);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
getEventCounts: (): $ReadOnlyArray<[string, number]> => {
|
|
71
|
+
return Array.from(eventCounts.entries());
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
setDurationThreshold: (
|
|
75
|
+
entryType: RawPerformanceEntryType,
|
|
76
|
+
durationThreshold: number,
|
|
77
|
+
) => {
|
|
78
|
+
durationThresholds.set(entryType, durationThreshold);
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
clearEntries: (entryType: RawPerformanceEntryType, entryName?: string) => {
|
|
82
|
+
entries = entries.filter(
|
|
83
|
+
e =>
|
|
84
|
+
e.entryType === entryType &&
|
|
85
|
+
(entryName == null || e.name === entryName),
|
|
86
|
+
);
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
getEntries: (
|
|
90
|
+
entryType?: RawPerformanceEntryType,
|
|
91
|
+
entryName?: string,
|
|
92
|
+
): $ReadOnlyArray<RawPerformanceEntry> => {
|
|
93
|
+
return entries.filter(
|
|
94
|
+
e =>
|
|
95
|
+
(entryType == null || e.entryType === entryType) &&
|
|
96
|
+
(entryName == null || e.name === entryName),
|
|
97
|
+
);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export default NativePerformanceObserverMock;
|