Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- Manifest: js/xpconnect/tests/browser/browser.toml
/* Any copyright is dedicated to the Public Domain.
"use strict";
/**
* Check that we record hangs in the parent process in telemetry events.
* This test would be an xpcshell test except xpcshell does not think
*/
add_task(async function test_browser_hang() {
// Trip some testing code to ensure we can test this. Sadly, this is a magic
// number corresponding to code in XPCJSContext.cpp
await SpecialPowers.pushPrefEnv({
set: [["dom.max_chrome_script_run_time", 2]],
});
await SpecialPowers.promiseTimeout(0);
// Hang for 1.2 seconds.
let now = Date.now();
let i = 0;
info("Start loop");
while (Date.now() - now < 2500) {
// The system clock can go backwards. Don't time out the test:
if (Date.now() - now < 0) {
info("Yikes, the system clock changed while running this test.");
now = Date.now();
}
i++;
}
let duration = (Date.now() - now) / 1000;
info("Looped " + i + " iterations.");
let events;
await TestUtils.waitForCondition(() => {
events = Services.telemetry.snapshotEvents(
Ci.nsITelemetry.DATASET_ALL_CHANNELS,
false
);
return events.parent?.some(e => e[1] == "slow_script_warning");
}, "Should find an event after doing this.").catch(e => ok(false, e));
events = events.parent || [];
let event = events.find(e => e[1] == "slow_script_warning");
ok(event, "Should have registered an event.");
if (event) {
is(event[3], "browser", "Should register as browser hang.");
let args = event[5];
is(args.uri_type, "browser", "Should register browser uri type.");
Assert.greater(
duration + 1,
parseFloat(args.hang_duration),
"hang duration should not exaggerate."
);
Assert.less(
duration - 1,
parseFloat(args.hang_duration),
"hang duration should not undersell."
);
}
});