| "use strict"; |
| |
| // Tests that most of the functionality of the window.performance object is available in web workers. |
| |
| importScripts("/resources/testharness.js"); |
| |
| function verifyEntry (entry, name, type, duration, assertName) { |
| assert_equals(entry.name, name, assertName + " has the right name"); |
| assert_equals(entry.entryType, type, assertName + " has the right type"); |
| assert_equals(entry.duration, duration, assertName + "has the right duration"); |
| } |
| |
| var start; |
| test(function testPerformanceNow () { |
| start = performance.now(); |
| }, "Can use performance.now in workers"); |
| |
| test(function testPerformanceMark () { |
| while (performance.now() == start) { } |
| performance.mark("mark1"); |
| // Stall the minimum amount of time to ensure the marks are separate |
| var now = performance.now(); |
| while (performance.now() == now) { } |
| performance.mark("mark2"); |
| }, "Can use performance.mark in workers"); |
| |
| test(function testPerformanceMeasure () { |
| performance.measure("measure1", "mark1", "mark2"); |
| }, "Can use performance.measure in workers"); |
| |
| test(function testPerformanceGetEntriesByName () { |
| var mark1s = performance.getEntriesByName("mark1"); |
| assert_equals(mark1s.length, 1, "getEntriesByName gave correct number of entries"); |
| verifyEntry(mark1s[0], "mark1", "mark", 0, "Entry got by name"); |
| }, "Can use performance.getEntriesByName in workers"); |
| |
| var marks; |
| var measures; |
| test(function testPerformanceGetEntriesByType () { |
| marks = performance.getEntriesByType("mark"); |
| assert_equals(marks.length, 2, "getEntriesByType gave correct number of entries"); |
| verifyEntry(marks[0], "mark1", "mark", 0, "First mark entry"); |
| verifyEntry(marks[1], "mark2", "mark", 0, "Second mark entry"); |
| measures = performance.getEntriesByType("measure"); |
| assert_equals(measures.length, 1, "getEntriesByType(\"measure\") gave correct number of entries"); |
| verifyEntry(measures[0], "measure1", "measure", marks[1].startTime - marks[0].startTime, "Measure entry"); |
| }, "Can use performance.getEntriesByType in workers"); |
| |
| test(function testPerformanceEntryOrder () { |
| assert_greater_than(marks[0].startTime, start, "First mark startTime is after a time before it"); |
| assert_greater_than(marks[1].startTime, marks[0].startTime, "Second mark startTime is after first mark startTime"); |
| assert_equals(measures[0].startTime, marks[0].startTime, "measure's startTime is the first mark's startTime"); |
| }, "Performance marks and measures seem to be working correctly in workers"); |
| |
| test(function testPerformanceClearing () { |
| performance.clearMarks(); |
| assert_equals(performance.getEntriesByType("mark").length, 0, "clearMarks cleared the marks"); |
| performance.clearMeasures(); |
| assert_equals(performance.getEntriesByType("measure").length, 0, "clearMeasures cleared the measures"); |
| }, "Can use clearMarks and clearMeasures in workers"); |
| |
| test(function testPerformanceResourceTiming () { // Resource timing |
| var start = performance.now(); |
| var xhr = new XMLHttpRequest(); |
| // Do a synchronous request and add a little artificial delay |
| xhr.open("GET", "/resources/testharness.js?pipe=trickle(d0.25)", false); |
| xhr.send(); |
| // The browser might or might not have added a resource performance entry for the importScripts() above; we're only interested in xmlhttprequest entries |
| var entries = performance.getEntriesByType("resource").filter(entry => entry.initiatorType == "xmlhttprequest"); |
| assert_equals(entries.length, 1, "getEntriesByType(\"resource\") returns one entry with initiatorType of xmlhttprequest"); |
| assert_true(!!entries[0].name.match(/\/resources\/testharness.js/), "Resource entry has loaded url as its name"); |
| assert_equals(entries[0].entryType, "resource", "Resource entry has correct entryType"); |
| assert_equals(entries[0].initiatorType, "xmlhttprequest", "Resource entry has correct initiatorType"); |
| var currentTimestamp = start; |
| var currentTimestampName = "a time before it"; |
| [ |
| "startTime", "fetchStart", "requestStart", "responseStart", "responseEnd" |
| ].forEach((name) => { |
| var timestamp = entries[0][name]; |
| // We want to skip over values that are 0 because of TAO securty rescritions |
| // Or else this test will fail. This can happen for "requestStart", "responseStart". |
| if (timestamp != 0) { |
| assert_greater_than_equal(timestamp, currentTimestamp, "Resource entry " + name + " is after " + currentTimestampName); |
| currentTimestamp = timestamp; |
| currentTimestampName = name; |
| } |
| }); |
| assert_greater_than(entries[0].responseEnd, entries[0].startTime, "The resource request should have taken at least some time"); |
| // We requested a delay of 250ms, but it could be a little bit less, and could be significantly more. |
| assert_greater_than(entries[0].responseEnd - entries[0].responseStart, 230, "Resource timing numbers reflect reality somewhat"); |
| }, "Resource timing seems to work in workers"); |
| |
| test(function testPerformanceClearResourceTimings () { |
| performance.clearResourceTimings(); |
| assert_equals(performance.getEntriesByType("resource").length, 0, "clearResourceTimings cleared the resource timings"); |
| }, "performance.clearResourceTimings in workers"); |
| |
| test(function testPerformanceSetResourceTimingBufferSize () { |
| performance.setResourceTimingBufferSize(0); |
| var xhr = new XMLHttpRequest(); |
| xhr.open("GET", "/resources/testharness.js", false); // synchronous request |
| xhr.send(); |
| assert_equals(performance.getEntriesByType("resource").length, 0, "setResourceTimingBufferSize(0) prevents resource entries from being added"); |
| }, "performance.setResourceTimingBufferSize in workers"); |
| |
| test(function testPerformanceHasNoTiming () { |
| assert_equals(typeof(performance.timing), "undefined", "performance.timing is undefined"); |
| }, "performance.timing is not available in workers"); |
| |
| test(function testPerformanceHasNoNavigation () { |
| assert_equals(typeof(performance.navigation), "undefined", "performance.navigation is undefined"); |
| }, "performance.navigation is not available in workers"); |
| |
| test(function testPerformanceHasToJSON () { |
| assert_equals(typeof(performance.toJSON), "function", "performance.toJSON is a function"); |
| }, "performance.toJSON is available in workers"); |
| |
| test(function testPerformanceNoNavigationEntries () { |
| assert_equals(performance.getEntriesByType("navigation").length, 0, "getEntriesByType(\"navigation\") returns nothing"); |
| assert_equals(performance.getEntriesByName("document", "navigation").length, 0, "getEntriesByName(\"document\", \"navigation\") returns nothing"); |
| assert_equals(performance.getEntriesByName("document").length, 0, "getEntriesByName(\"document\") returns nothing"); |
| var hasNavigation = performance.getEntries().some((e,i,a) => { |
| return e.entryType == "navigation"; |
| }); |
| assert_false(hasNavigation, "getEntries should return no navigation entries."); |
| |
| }, "There are no navigation type performance entries in workers"); |
| |
| done(); |