1// META: script=resources/user-timing-helper.js
2
3function cleanupPerformanceTimeline() {
4 performance.clearMarks();
5 performance.clearMeasures();
6}
7
8async_test(function (t) {
9 this.add_cleanup(cleanupPerformanceTimeline);
10 let measureEntries = [];
11 const timeStamp1 = 784.4;
12 const timeStamp2 = 1234.5;
13 const timeStamp3 = 66.6;
14 const timeStamp4 = 5566;
15 const expectedEntries =
16 [{ entryType: "measure", name: "measure1", detail: null, startTime: 0 },
17 { entryType: "measure", name: "measure2", detail: null, startTime: 0 },
18 { entryType: "measure", name: "measure3", detail: null, startTime: 0 },
19 { entryType: "measure", name: "measure4", detail: null },
20 { entryType: "measure", name: "measure5", detail: null, startTime: 0 },
21 { entryType: "measure", name: "measure6", detail: null, startTime: timeStamp1 },
22 { entryType: "measure", name: "measure7", detail: null, startTime: timeStamp1, duration: timeStamp2 - timeStamp1 },
23 { entryType: "measure", name: "measure8", detail: null, startTime: 0 },
24 { entryType: "measure", name: "measure9", detail: null, startTime: 0 },
25 { entryType: "measure", name: "measure10", detail: null, startTime: timeStamp1 },
26 { entryType: "measure", name: "measure11", detail: null, startTime: timeStamp3 },
27 { entryType: "measure", name: "measure12", detail: null, startTime: 0 },
28 { entryType: "measure", name: "measure13", detail: null, startTime: 0 },
29 { entryType: "measure", name: "measure14", detail: null, startTime: timeStamp3, duration: timeStamp1 - timeStamp3 },
30 { entryType: "measure", name: "measure15", detail: null, startTime: timeStamp1, duration: timeStamp2 - timeStamp1 },
31 { entryType: "measure", name: "measure16", detail: null, startTime: timeStamp1 },
32 { entryType: "measure", name: "measure17", detail: { customInfo: 159 }, startTime: timeStamp3, duration: timeStamp2 - timeStamp3 },
33 { entryType: "measure", name: "measure18", detail: null, startTime: timeStamp1, duration: timeStamp2 - timeStamp1 },
34 { entryType: "measure", name: "measure19", detail: null, startTime: timeStamp1, duration: timeStamp2 - timeStamp1 },
35 { entryType: "measure", name: "measure20", detail: null, startTime: 0 },
36 { entryType: "measure", name: "measure21", detail: null, startTime: 0 },
37 { entryType: "measure", name: "measure22", detail: null, startTime: 0 },
38 { entryType: "measure", name: "measure23", detail: null, startTime: 0 }];
39 const observer = new PerformanceObserver(
40 t.step_func(function (entryList, obs) {
41 measureEntries =
42 measureEntries.concat(entryList.getEntries());
43 if (measureEntries.length >= expectedEntries.length) {
44 checkEntries(measureEntries, expectedEntries);
45 observer.disconnect();
46 t.done();
47 }
48 })
49 );
50 observer.observe({ entryTypes: ["measure"] });
51 self.performance.mark("mark1", { detail: { randomInfo: 3 }, startTime: timeStamp1 });
52 self.performance.mark("mark2", { startTime: timeStamp2 });
53
54 const returnedEntries = [];
55 returnedEntries.push(self.performance.measure("measure1"));
56 returnedEntries.push(self.performance.measure("measure2", undefined));
57 returnedEntries.push(self.performance.measure("measure3", null));
58 returnedEntries.push(self.performance.measure("measure4", 'mark1'));
59 returnedEntries.push(
60 self.performance.measure("measure5", null, 'mark1'));
61 returnedEntries.push(
62 self.performance.measure("measure6", 'mark1', undefined));
63 returnedEntries.push(
64 self.performance.measure("measure7", 'mark1', 'mark2'));
65 returnedEntries.push(
66 self.performance.measure("measure8", {}));
67 returnedEntries.push(
68 self.performance.measure("measure9", { start: undefined }));
69 returnedEntries.push(
70 self.performance.measure("measure10", { start: 'mark1' }));
71 returnedEntries.push(
72 self.performance.measure("measure11", { start: timeStamp3 }));
73 returnedEntries.push(
74 self.performance.measure("measure12", { end: undefined }));
75 returnedEntries.push(
76 self.performance.measure("measure13", { end: 'mark1' }));
77 returnedEntries.push(
78 self.performance.measure("measure14", { start: timeStamp3, end: 'mark1' }));
79 returnedEntries.push(
80 self.performance.measure("measure15", { start: timeStamp1, end: timeStamp2, detail: undefined }));
81 returnedEntries.push(
82 self.performance.measure("measure16", { start: 'mark1', end: undefined, detail: null }));
83 returnedEntries.push(
84 self.performance.measure("measure17", { start: timeStamp3, end: 'mark2', detail: { customInfo: 159 }}));
85 returnedEntries.push(
86 self.performance.measure("measure18", { start: timeStamp1, duration: timeStamp2 - timeStamp1 }));
87 returnedEntries.push(
88 self.performance.measure("measure19", { duration: timeStamp2 - timeStamp1, end: timeStamp2 }));
89 // {}, null, undefined, invalid-dict passed to startOrOptions are interpreted as start time being 0.
90 returnedEntries.push(self.performance.measure("measure20", {}, 'mark1'));
91 returnedEntries.push(self.performance.measure("measure21", null, 'mark1'));
92 returnedEntries.push(self.performance.measure("measure22", undefined, 'mark1'));
93 returnedEntries.push(self.performance.measure("measure23", { invalidDict:1 }, 'mark1'));
94 checkEntries(returnedEntries, expectedEntries);
95}, "measure entries' detail and start/end are customizable");
96
97test(function() {
98 this.add_cleanup(cleanupPerformanceTimeline);
99 assert_throws_js(TypeError, function() {
100 self.performance.measure("optionsAndNumberEnd", {'start': 2}, 12);
101 }, "measure should throw a TypeError when passed an options object and an end time");
102 assert_throws_js(TypeError, function() {
103 self.performance.measure("optionsAndMarkEnd", {'start': 2}, 'mark1');
104 }, "measure should throw a TypeError when passed an options object and an end mark");
105 assert_throws_js(TypeError, function() {
106 self.performance.measure("negativeStartInOptions", {'start': -1});
107 }, "measure cannot have a negative time stamp.");
108 assert_throws_js(TypeError, function() {
109 self.performance.measure("negativeEndInOptions", {'end': -1});
110 }, "measure cannot have a negative time stamp for end.");
111}, "measure should throw a TypeError when passed an invalid argument combination");
112