1 | import {set} from './utilities';
|
2 |
|
3 | type UserTimingMock = typeof window.performance.timing;
|
4 |
|
5 | export default class Performance {
|
6 | private isUsingMockUserTiming = false;
|
7 | private originalUserTiming?: UserTimingMock;
|
8 |
|
9 | mock(timing: Partial<UserTimingMock> = {}) {
|
10 | if (this.isUsingMockUserTiming) {
|
11 | throw new Error(
|
12 | 'You tried to mock window.performance.timing when it was already mocked.',
|
13 | );
|
14 | }
|
15 |
|
16 | this.originalUserTiming = window.performance.timing;
|
17 |
|
18 | const mockTiming: Partial<UserTimingMock> = {
|
19 | navigationStart: 0,
|
20 | unloadEventStart: 0,
|
21 | unloadEventEnd: 0,
|
22 | redirectStart: 0,
|
23 | redirectEnd: 0,
|
24 | fetchStart: 0,
|
25 | domainLookupStart: 0,
|
26 | domainLookupEnd: 0,
|
27 | connectStart: 0,
|
28 | connectEnd: 0,
|
29 | secureConnectionStart: 0,
|
30 | requestStart: 0,
|
31 | responseStart: 0,
|
32 | responseEnd: 0,
|
33 | domLoading: 0,
|
34 | domInteractive: 0,
|
35 | domContentLoadedEventStart: 0,
|
36 | domContentLoadedEventEnd: 0,
|
37 | domComplete: 0,
|
38 | loadEventStart: 0,
|
39 | loadEventEnd: 0,
|
40 | ...timing,
|
41 | };
|
42 |
|
43 | set(window.performance, 'timing', mockTiming);
|
44 | this.isUsingMockUserTiming = true;
|
45 | }
|
46 |
|
47 | restore() {
|
48 | if (!this.isUsingMockUserTiming) {
|
49 | throw new Error(
|
50 | 'You tried to restore window.performance.timing when it was already restored.',
|
51 | );
|
52 | }
|
53 |
|
54 | set(window.performance, 'timing', this.originalUserTiming);
|
55 | this.isUsingMockUserTiming = false;
|
56 | }
|
57 |
|
58 | isMocked() {
|
59 | return this.isUsingMockUserTiming;
|
60 | }
|
61 | }
|