Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: tsan
- Manifest: tools/profiler/tests/browser/browser.toml
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* Test that console timing methods (console.time, console.timeEnd,
* console.timeStamp) create the expected profiler markers.
*/
add_task(async function test_console_time_markers() {
info("Start the profiler to capture markers.");
await ProfilerTestUtils.startProfilerForMarkerTests();
info("Create a tab with a test page.");
const url = BASE_URL + "single_frame.html";
await BrowserTestUtils.withNewTab(url, async contentBrowser => {
const contentPid = await SpecialPowers.spawn(
contentBrowser,
[],
() => Services.appinfo.processID
);
await SpecialPowers.spawn(contentBrowser, [], async () => {
// console.time/timeEnd pair should create a marker.
content.console.time("testTimer");
await new Promise(resolve => content.setTimeout(resolve, 5));
content.console.timeEnd("testTimer");
// console.timeStamp also should create a marker.
content.console.timeStamp("testTimeStamp");
// console.time without timeEnd should not create a marker.
content.console.time("orphanedTimer");
// console.timeEnd without matching time should not create a marker
content.console.timeEnd("nonexistentTimer");
});
const { contentThread } = await stopProfilerNowAndGetThreads(contentPid);
const markers = ProfilerTestUtils.getInflatedMarkerData(contentThread);
const consoleMarkers = markers.filter(m => m.name === "ConsoleTiming");
Assert.equal(
consoleMarkers.length,
2,
"Should have exactly 2 ConsoleTiming markers"
);
info("Verify the console.time/timeEnd marker");
const timeMarker = consoleMarkers.find(
m => m.data && m.data.label === "testTimer"
);
Assert.ok(timeMarker, "Should find marker for testTimer");
Assert.equal(
timeMarker.data.entryType,
"time",
"Marker should have entryType 'time'"
);
Assert.equal(
typeof timeMarker.startTime,
"number",
"startTime should be a number"
);
Assert.equal(
typeof timeMarker.endTime,
"number",
"endTime should be a number"
);
Assert.greater(
timeMarker.endTime,
timeMarker.startTime,
"endTime should be after startTime for interval marker"
);
info("Verify the console.timeStamp marker");
const timeStampMarker = consoleMarkers.find(
m => m.data && m.data.label === "testTimeStamp"
);
Assert.ok(timeStampMarker, "Should find marker for testTimeStamp");
Assert.equal(
timeStampMarker.data.entryType,
"timeStamp",
"Marker should have entryType 'timeStamp'"
);
Assert.equal(
typeof timeStampMarker.startTime,
"number",
"startTime should be a number"
);
Assert.equal(
typeof timeStampMarker.endTime,
"number",
"endTime should be a number"
);
Assert.equal(
timeStampMarker.endTime,
0,
"endTime should be 0 for instant marker"
);
info("Verify the other markers don't exist.");
// Verify that orphaned console.time did not create a marker.
const orphanedMarker = consoleMarkers.find(
m => m.data && m.data.label === "orphanedTimer"
);
Assert.ok(
!orphanedMarker,
"Should not find marker for orphanedTimer (time without timeEnd)"
);
// Verify that console.timeEnd without matching time did not create a marker.
const nonexistentMarker = consoleMarkers.find(
m => m.data && m.data.label === "nonexistentTimer"
);
Assert.ok(
!nonexistentMarker,
"Should not find marker for nonexistentTimer (timeEnd without time)"
);
});
});