36
});
37
38
describe('User Timing API', () => {
39
- let clearedMarks;
39
+ let currentlyNotClearedMarks;
40
+ let registeredMarks;
41
let featureDetectionMarkName = null;
41
- let marks;
42
let setPerformanceMock;
43
44
function createUserTimingPolyfill() {
45
featureDetectionMarkName = null;
46
47
- clearedMarks = [];
48
- marks = [];
47
+ currentlyNotClearedMarks = [];
48
+ registeredMarks = [];
49
50
// Remove file-system specific bits or version-specific bits of information from the module range marks.
51
function filterMarkData(markName) {
66
clearMarks(markName) {
67
markName = filterMarkData(markName);
68
69
- clearedMarks.push(markName);
70
- marks = marks.filter(mark => mark !== markName);
69
+ currentlyNotClearedMarks = currentlyNotClearedMarks.filter(
70
+ mark => mark !== markName,
71
+ );
72
},
73
mark(markName, markOptions) {
74
markName = filterMarkData(markName);
77
featureDetectionMarkName = markName;
78
}
79
79
- marks.push(markName);
80
+ registeredMarks.push(markName);
81
+ currentlyNotClearedMarks.push(markName);
82
83
if (markOptions != null) {
84
// This is triggers the feature detection.
88
};
89
}
90
89
- function clearPendingMarks() {
90
- clearedMarks.splice(0);
91
+ function eraseRegisteredMarks() {
92
+ registeredMarks.splice(0);
93
}
94
95
function dispatchAndSetCurrentEvent(element, event) {
109
110
afterEach(() => {
111
// Verify all logged marks also get cleared.
110
- expect(marks).toHaveLength(0);
112
+ expect(currentlyNotClearedMarks).toHaveLength(0);
113
114
setPerformanceMock(null);
115
});
122
it('should mark sync render without suspends or state updates', () => {
123
legacyRender(<div />);
124
123
- expect(clearedMarks).toMatchInlineSnapshot(`
125
+ expect(registeredMarks).toMatchInlineSnapshot(`
126
[
127
"--schedule-render-1",
128
"--render-start-1",
156
</React.Suspense>,
157
);
158
157
- expect(clearedMarks).toMatchInlineSnapshot(`
159
+ expect(registeredMarks).toMatchInlineSnapshot(`
160
[
161
"--schedule-render-2",
162
"--render-start-2",
176
]
177
`);
178
177
- clearPendingMarks();
179
+ eraseRegisteredMarks();
180
181
await fakeSuspensePromise;
180
- expect(clearedMarks).toMatchInlineSnapshot(`
182
+ expect(registeredMarks).toMatchInlineSnapshot(`
183
[
184
"--suspense-resolved-0-Example",
185
]
202
</React.Suspense>,
203
);
204
203
- expect(clearedMarks).toMatchInlineSnapshot(`
205
+ expect(registeredMarks).toMatchInlineSnapshot(`
206
[
207
"--schedule-render-2",
208
"--render-start-2",
222
]
223
`);
224
223
- clearPendingMarks();
225
+ eraseRegisteredMarks();
226
227
await expect(fakeSuspensePromise).rejects.toThrow();
226
- expect(clearedMarks).toContain(`--suspense-rejected-0-Example`);
228
+ expect(registeredMarks).toContain(`--suspense-rejected-0-Example`);
229
});
230
231
// @reactVersion <= 18.2
256
</ErrorBoundary>,
257
);
258
257
- expect(clearedMarks).toMatchInlineSnapshot(`
259
+ expect(registeredMarks).toMatchInlineSnapshot(`
260
[
261
"--schedule-render-1",
262
"--render-start-1",
312
it('should mark concurrent render without suspends or state updates', async () => {
313
modernRender(<div />);
314
313
- expect(clearedMarks).toMatchInlineSnapshot(`
315
+ expect(registeredMarks).toMatchInlineSnapshot(`
316
[
317
"--schedule-render-32",
318
]
319
`);
320
319
- clearPendingMarks();
321
+ eraseRegisteredMarks();
322
323
await waitForPaint([]);
324
323
- expect(clearedMarks).toMatchInlineSnapshot(`
325
+ expect(registeredMarks).toMatchInlineSnapshot(`
326
[
327
"--render-start-32",
328
"--render-stop",
358
359
await waitFor(['Foo']);
360
359
- expect(clearedMarks).toMatchInlineSnapshot(`
361
+ expect(registeredMarks).toMatchInlineSnapshot(`
362
[
363
"--schedule-render-128",
364
"--render-start-128",
385
</React.Suspense>,
386
);
387
386
- expect(clearedMarks).toMatchInlineSnapshot(`
388
+ expect(registeredMarks).toMatchInlineSnapshot(`
389
[
390
"--schedule-render-32",
391
]
392
`);
393
392
- clearPendingMarks();
394
+ eraseRegisteredMarks();
395
396
await waitForPaint([]);
397
396
- expect(clearedMarks).toMatchInlineSnapshot(`
398
+ expect(registeredMarks).toMatchInlineSnapshot(`
399
[
400
"--render-start-32",
401
"--component-render-start-Example",
416
]
417
`);
418
417
- clearPendingMarks();
419
+ eraseRegisteredMarks();
420
421
await resolveFakePromise();
420
- expect(clearedMarks).toMatchInlineSnapshot(`
422
+ expect(registeredMarks).toMatchInlineSnapshot(`
423
[
424
"--suspense-resolved-0-Example",
425
]
442
</React.Suspense>,
443
);
444
443
- expect(clearedMarks).toMatchInlineSnapshot(`
445
+ expect(registeredMarks).toMatchInlineSnapshot(`
446
[
447
"--schedule-render-32",
448
]
449
`);
450
449
- clearPendingMarks();
451
+ eraseRegisteredMarks();
452
453
await waitForPaint([]);
454
453
- expect(clearedMarks).toMatchInlineSnapshot(`
455
+ expect(registeredMarks).toMatchInlineSnapshot(`
456
[
457
"--render-start-32",
458
"--component-render-start-Example",
473
]
474
`);
475
474
- clearPendingMarks();
476
+ eraseRegisteredMarks();
477
478
await expect(() => {
479
rejectFakePromise(new Error('error'));
480
return fakeSuspensePromise;
481
}).rejects.toThrow();
480
- expect(clearedMarks).toMatchInlineSnapshot(`
482
+ expect(registeredMarks).toMatchInlineSnapshot(`
483
[
484
"--suspense-rejected-0-Example",
485
]
499
500
modernRender(<Example />);
501
500
- expect(clearedMarks).toMatchInlineSnapshot(`
502
+ expect(registeredMarks).toMatchInlineSnapshot(`
503
[
504
"--schedule-render-32",
505
]
506
`);
507
506
- clearPendingMarks();
508
+ eraseRegisteredMarks();
509
510
await waitForPaint([]);
511
510
- expect(clearedMarks).toMatchInlineSnapshot(`
512
+ expect(registeredMarks).toMatchInlineSnapshot(`
513
[
514
"--render-start-32",
515
"--component-render-start-Example",
556
557
modernRender(<Example />);
558
557
- expect(clearedMarks).toMatchInlineSnapshot(`
559
+ expect(registeredMarks).toMatchInlineSnapshot(`
560
[
561
"--schedule-render-32",
562
]
563
`);
564
563
- clearPendingMarks();
565
+ eraseRegisteredMarks();
566
567
await waitForPaint([]);
568
567
- expect(clearedMarks).toMatchInlineSnapshot(`
569
+ expect(registeredMarks).toMatchInlineSnapshot(`
570
[
571
"--render-start-32",
572
"--component-render-start-Example",
614
615
modernRender(<Example />);
616
615
- expect(clearedMarks).toMatchInlineSnapshot(`
617
+ expect(registeredMarks).toMatchInlineSnapshot(`
618
[
619
"--schedule-render-32",
620
]
621
`);
622
621
- clearPendingMarks();
623
+ eraseRegisteredMarks();
624
625
let errorMessage;
626
jest.spyOn(console, 'error').mockImplementation(message => {
634
'Cannot update during an existing state transition',
635
);
636
635
- expect(clearedMarks).toMatchInlineSnapshot(`
637
+ expect(registeredMarks).toMatchInlineSnapshot(`
638
[
639
"--render-start-32",
640
"--component-render-start-Example",
670
671
modernRender(<Example />);
672
671
- expect(clearedMarks).toMatchInlineSnapshot(`
673
+ expect(registeredMarks).toMatchInlineSnapshot(`
674
[
675
"--schedule-render-32",
676
]
677
`);
678
677
- clearPendingMarks();
679
+ eraseRegisteredMarks();
680
681
let errorMessage;
682
jest.spyOn(console, 'error').mockImplementation(message => {
690
'Cannot update during an existing state transition',
691
);
692
691
- expect(clearedMarks).toMatchInlineSnapshot(`
693
+ expect(registeredMarks).toMatchInlineSnapshot(`
694
[
695
"--render-start-32",
696
"--component-render-start-Example",
723
724
modernRender(<Example />);
725
724
- expect(clearedMarks).toMatchInlineSnapshot(`
726
+ expect(registeredMarks).toMatchInlineSnapshot(`
727
[
728
"--schedule-render-32",
729
]
730
`);
731
730
- clearPendingMarks();
732
+ eraseRegisteredMarks();
733
734
await waitForPaint([]);
735
734
- expect(clearedMarks).toMatchInlineSnapshot(`
736
+ expect(registeredMarks).toMatchInlineSnapshot(`
737
[
738
"--render-start-32",
739
"--component-render-start-Example",
783
784
await waitForAll([]);
785
784
- expect(clearedMarks).toMatchInlineSnapshot(`
786
+ expect(registeredMarks).toMatchInlineSnapshot(`
787
[
788
"--schedule-render-32",
789
"--render-start-32",
836
837
await waitForAll([]);
838
837
- expect(clearedMarks).toMatchInlineSnapshot(`
839
+ expect(registeredMarks).toMatchInlineSnapshot(`
840
[
841
"--schedule-render-32",
842
"--render-start-32",
886
</ErrorBoundary>,
887
);
888
887
- expect(clearedMarks).toMatchInlineSnapshot(`
889
+ expect(registeredMarks).toMatchInlineSnapshot(`
890
[
891
"--schedule-render-32",
892
]
893
`);
894
893
- clearPendingMarks();
895
+ eraseRegisteredMarks();
896
897
await waitForPaint([]);
898
897
- expect(clearedMarks).toMatchInlineSnapshot(`
899
+ expect(registeredMarks).toMatchInlineSnapshot(`
900
[
901
"--render-start-32",
902
"--component-render-start-ErrorBoundary",
985
986
await waitForPaint(['layout 1 mount', 'layout 2 mount']);
987
986
- expect(clearedMarks).toMatchInlineSnapshot(`
988
+ expect(registeredMarks).toMatchInlineSnapshot(`
989
[
990
"--schedule-render-32",
991
"--render-start-32",
1010
]
1011
`);
1012
1011
- clearPendingMarks();
1013
+ eraseRegisteredMarks();
1014
1015
await waitForAll([
1016
'passive 1 mount',
1018
'passive 3 mount',
1019
]);
1020
1019
- expect(clearedMarks).toMatchInlineSnapshot(`
1021
+ expect(registeredMarks).toMatchInlineSnapshot(`
1022
[
1023
"--passive-effects-start-32",
1024
"--component-passive-effect-mount-start-ComponentWithEffects",
1031
]
1032
`);
1033
1032
- clearPendingMarks();
1034
+ eraseRegisteredMarks();
1035
1036
await waitForAll([]);
1037
1045
'passive 3 unmount',
1046
]);
1047
1046
- expect(clearedMarks).toMatchInlineSnapshot(`
1048
+ expect(registeredMarks).toMatchInlineSnapshot(`
1049
[
1050
"--schedule-render-2",
1051
"--render-start-2",
1087
it('regression test SyncLane', () => {
1088
legacyRender(<div />);
1089
1088
- expect(clearedMarks).toMatchInlineSnapshot(`
1090
+ expect(registeredMarks).toMatchInlineSnapshot(`
1091
[
1092
"--schedule-render-1",
1093
"--render-start-1",
1118
1119
it('regression test DefaultLane', () => {
1120
modernRender(<div />);
1119
- expect(clearedMarks).toMatchInlineSnapshot(`
1121
+ expect(registeredMarks).toMatchInlineSnapshot(`
1122
[
1123
"--schedule-render-32",
1124
]
1139
modernRender(<App />);
1140
await waitForAll([]);
1141
1140
- clearedMarks.splice(0);
1142
+ eraseRegisteredMarks();
1143
1144
targetRef.current.click();
1145
1146
// Wait a frame, for React to process the "click" update.
1147
await Promise.resolve();
1148
1147
- expect(clearedMarks).toMatchInlineSnapshot(`
1149
+ expect(registeredMarks).toMatchInlineSnapshot(`
1150
[
1151
"--schedule-state-update-2-App",
1152
"--render-start-2",
1180
modernRender(<App />);
1181
await waitForAll([]);
1182
1181
- clearedMarks.splice(0);
1183
+ eraseRegisteredMarks();
1184
1185
const event = document.createEvent('MouseEvents');
1186
event.initEvent('mouseover', true, true);
1188
1189
await waitForAll([]);
1190
1189
- expect(clearedMarks).toMatchInlineSnapshot(`
1191
+ expect(registeredMarks).toMatchInlineSnapshot(`
1192
[
1193
"--schedule-state-update-8-App",
1194
"--render-start-8",