941
});
942
943
// @gate enableTransitionTracing
944
- it('should correctly trace interactions for tracing markers complete', async () => {
944
+ it('should correctly trace basic interaction with tracing markers', async () => {
945
const transitionCallbacks = {
946
onTransitionStart: (name, startTime) => {
947
Scheduler.unstable_yieldValue(
948
`onTransitionStart(${name}, ${startTime})`,
949
);
950
},
951
+ onTransitionProgress: (name, startTime, endTime, pending) => {
952
+ const suspenseNames = pending.map(p => p.name || '<null>').join(', ');
953
+ Scheduler.unstable_yieldValue(
954
+ `onTransitionProgress(${name}, ${startTime}, ${endTime}, [${suspenseNames}])`,
955
+ );
956
+ },
957
onTransitionComplete: (name, startTime, endTime) => {
958
Scheduler.unstable_yieldValue(
959
`onTransitionComplete(${name}, ${startTime}, ${endTime})`,
960
);
961
},
962
+ onMarkerProgress: (
963
+ transitioName,
964
+ markerName,
965
+ startTime,
966
+ currentTime,
967
+ pending,
968
+ ) => {
969
+ const suspenseNames = pending.map(p => p.name || '<null>').join(', ');
970
+ Scheduler.unstable_yieldValue(
971
+ `onMarkerProgress(${transitioName}, ${markerName}, ${startTime}, ${currentTime}, [${suspenseNames}])`,
972
+ );
973
+ },
974
+ onMarkerComplete: (transitioName, markerName, startTime, endTime) => {
975
+ Scheduler.unstable_yieldValue(
976
+ `onMarkerComplete(${transitioName}, ${markerName}, ${startTime}, ${endTime})`,
977
+ );
978
+ },
979
+ };
980
+
981
+ let navigateToPageTwo;
982
+ function App() {
983
+ const [navigate, setNavigate] = useState(false);
984
+ navigateToPageTwo = () => {
985
+ setNavigate(true);
986
+ };
987
+
988
+ return (
989
+ <div>
990
+ {navigate ? (
991
+ <React.unstable_TracingMarker name="marker two" key="marker two">
992
+ <Text text="Page Two" />
993
+ </React.unstable_TracingMarker>
994
+ ) : (
995
+ <React.unstable_TracingMarker name="marker one">
996
+ <Text text="Page One" />
997
+ </React.unstable_TracingMarker>
998
+ )}
999
+ </div>
1000
+ );
1001
+ }
1002
+
1003
+ const root = ReactNoop.createRoot({transitionCallbacks});
1004
+ await act(async () => {
1005
+ root.render(<App />);
1006
+ ReactNoop.expire(1000);
1007
+ await advanceTimers(1000);
1008
+
1009
+ expect(Scheduler).toFlushAndYield(['Page One']);
1010
+
1011
+ await act(async () => {
1012
+ startTransition(() => navigateToPageTwo(), {name: 'page transition'});
1013
+
1014
+ ReactNoop.expire(1000);
1015
+ await advanceTimers(1000);
1016
+
1017
+ expect(Scheduler).toFlushAndYield([
1018
+ 'Page Two',
1019
+ 'onTransitionStart(page transition, 1000)',
1020
+ 'onMarkerComplete(page transition, marker two, 1000, 2000)',
1021
+ 'onTransitionComplete(page transition, 1000, 2000)',
1022
+ ]);
1023
+ });
1024
+ });
1025
+ });
1026
+
1027
+ // @gate enableTransitionTracing
1028
+ it('should correctly trace interactions for tracing markers', async () => {
1029
+ const transitionCallbacks = {
1030
+ onTransitionStart: (name, startTime) => {
1031
+ Scheduler.unstable_yieldValue(
1032
+ `onTransitionStart(${name}, ${startTime})`,
1033
+ );
1034
+ },
1035
+ onTransitionComplete: (name, startTime, endTime) => {
1036
+ Scheduler.unstable_yieldValue(
1037
+ `onTransitionComplete(${name}, ${startTime}, ${endTime})`,
1038
+ );
1039
+ },
1040
+ onMarkerProgress: (
1041
+ transitioName,
1042
+ markerName,
1043
+ startTime,
1044
+ currentTime,
1045
+ pending,
1046
+ ) => {
1047
+ const suspenseNames = pending.map(p => p.name || '<null>').join(', ');
1048
+ Scheduler.unstable_yieldValue(
1049
+ `onMarkerProgress(${transitioName}, ${markerName}, ${startTime}, ${currentTime}, [${suspenseNames}])`,
1050
+ );
1051
+ },
1052
onMarkerComplete: (transitioName, markerName, startTime, endTime) => {
1053
Scheduler.unstable_yieldValue(
1054
`onMarkerComplete(${transitioName}, ${markerName}, ${startTime}, ${endTime})`,
1067
{navigate ? (
1068
<Suspense
1069
fallback={<Text text="Loading..." />}
974
- name="suspense page">
1070
+ unstable_name="suspense page">
1071
<AsyncText text="Page Two" />
1072
<React.unstable_TracingMarker name="sync marker" />
1073
<React.unstable_TracingMarker name="async marker">
1074
<Suspense
1075
fallback={<Text text="Loading..." />}
980
- name="marker suspense">
1076
+ unstable_name="marker suspense">
1077
<AsyncText text="Marker Text" />
1078
</Suspense>
1079
</React.unstable_TracingMarker>
1116
'Page Two',
1117
'Suspend [Marker Text]',
1118
'Loading...',
1119
+ 'onMarkerProgress(page transition, async marker, 1000, 3000, [marker suspense])',
1120
'onMarkerComplete(page transition, sync marker, 1000, 3000)',
1121
]);
1122
1126
1127
expect(Scheduler).toFlushAndYield([
1128
'Marker Text',
1129
+ 'onMarkerProgress(page transition, async marker, 1000, 4000, [])',
1130
'onMarkerComplete(page transition, async marker, 1000, 4000)',
1131
'onTransitionComplete(page transition, 1000, 4000)',
1132
]);
1146
`onTransitionComplete(${name}, ${startTime}, ${endTime})`,
1147
);
1148
},
1149
+ onMarkerProgress: (
1150
+ transitioName,
1151
+ markerName,
1152
+ startTime,
1153
+ currentTime,
1154
+ pending,
1155
+ ) => {
1156
+ const suspenseNames = pending.map(p => p.name || '<null>').join(', ');
1157
+ Scheduler.unstable_yieldValue(
1158
+ `onMarkerProgress(${transitioName}, ${markerName}, ${startTime}, ${currentTime}, [${suspenseNames}])`,
1159
+ );
1160
+ },
1161
onMarkerComplete: (transitioName, markerName, startTime, endTime) => {
1162
Scheduler.unstable_yieldValue(
1163
`onMarkerComplete(${transitioName}, ${markerName}, ${startTime}, ${endTime})`,
1176
<div>
1177
{navigate ? (
1178
<React.unstable_TracingMarker name="outer marker">
1069
- <Suspense fallback={<Text text="Outer..." />}>
1179
+ <Suspense
1180
+ fallback={<Text text="Outer..." />}
1181
+ unstable_name="outer">
1182
<AsyncText text="Outer Text" />
1071
- <Suspense fallback={<Text text="Inner One..." />}>
1183
+ <Suspense
1184
+ fallback={<Text text="Inner One..." />}
1185
+ unstable_name="inner one">
1186
<React.unstable_TracingMarker name="marker one">
1187
<AsyncText text="Inner Text One" />
1188
</React.unstable_TracingMarker>
1189
</Suspense>
1076
- <Suspense fallback={<Text text="Inner Two..." />}>
1190
+ <Suspense
1191
+ fallback={<Text text="Inner Two..." />}
1192
+ unstable_name="inner two">
1193
<React.unstable_TracingMarker name="marker two">
1194
<AsyncText text="Inner Text Two" />
1195
</React.unstable_TracingMarker>
1226
'Inner Two...',
1227
'Outer...',
1228
'onTransitionStart(page transition, 1000)',
1229
+ 'onMarkerProgress(page transition, outer marker, 1000, 2000, [outer])',
1230
]);
1231
1232
ReactNoop.expire(1000);
1242
'Suspend [Inner Text One]',
1243
'Inner One...',
1244
'Inner Text Two',
1245
+ 'onMarkerProgress(page transition, outer marker, 1000, 4000, [inner one])',
1246
'onMarkerComplete(page transition, marker two, 1000, 4000)',
1247
]);
1248
1251
await resolveText('Inner Text One');
1252
expect(Scheduler).toFlushAndYield([
1253
'Inner Text One',
1254
+ 'onMarkerProgress(page transition, outer marker, 1000, 5000, [])',
1255
'onMarkerComplete(page transition, marker one, 1000, 5000)',
1256
'onMarkerComplete(page transition, outer marker, 1000, 5000)',
1257
'onTransitionComplete(page transition, 1000, 5000)',
1352
`onTransitionComplete(${name}, ${startTime}, ${endTime})`,
1353
);
1354
},
1355
+ onMarkerProgress: (
1356
+ transitioName,
1357
+ markerName,
1358
+ startTime,
1359
+ currentTime,
1360
+ pending,
1361
+ ) => {
1362
+ const suspenseNames = pending.map(p => p.name || '<null>').join(', ');
1363
+ Scheduler.unstable_yieldValue(
1364
+ `onMarkerProgress(${transitioName}, ${markerName}, ${startTime}, ${currentTime}, [${suspenseNames}])`,
1365
+ );
1366
+ },
1367
onMarkerComplete: (transitioName, markerName, startTime, endTime) => {
1368
Scheduler.unstable_yieldValue(
1369
`onMarkerComplete(${transitioName}, ${markerName}, ${startTime}, ${endTime})`,
1410
'Suspend [Page Two]',
1411
'Loading...',
1412
'onTransitionStart(page transition, 1000)',
1413
+ 'onMarkerProgress(page transition, old marker, 1000, 1000, [<null>])',
1414
]);
1415
1416
ReactNoop.expire(1000);
1443
`onTransitionComplete(${name}, ${startTime}, ${endTime})`,
1444
);
1445
},
1446
+ onMarkerProgress: (
1447
+ transitioName,
1448
+ markerName,
1449
+ startTime,
1450
+ currentTime,
1451
+ pending,
1452
+ ) => {
1453
+ const suspenseNames = pending.map(p => p.name || '<null>').join(', ');
1454
+ Scheduler.unstable_yieldValue(
1455
+ `onMarkerProgress(${transitioName}, ${markerName}, ${startTime}, ${currentTime}, [${suspenseNames}])`,
1456
+ );
1457
+ },
1458
onMarkerComplete: (transitioName, markerName, startTime, endTime) => {
1459
Scheduler.unstable_yieldValue(
1460
`onMarkerComplete(${transitioName}, ${markerName}, ${startTime}, ${endTime})`,
1501
'Suspend [Page Two]',
1502
'Loading...',
1503
'onTransitionStart(page transition, 1000)',
1504
+ 'onMarkerProgress(page transition, old marker, 1000, 2000, [<null>])',
1505
]);
1506
1507
ReactNoop.expire(1000);
1512
'Suspend [Page Two]',
1513
'Loading...',
1514
'onTransitionStart(marker transition, 2000)',
1515
+ 'onMarkerProgress(marker transition, new marker, 2000, 3000, [])',
1516
+ 'onMarkerComplete(marker transition, new marker, 2000, 3000)',
1517
+ 'onTransitionComplete(marker transition, 2000, 3000)',
1518
]);
1519
ReactNoop.expire(1000);
1520
await advanceTimers(1000);