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 113