"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();