Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

"use strict";
add_task(function test_compartment_realm_counts() {
const compsSystem = "MEMORY_JS_COMPARTMENTS_SYSTEM";
const compsUser = "MEMORY_JS_COMPARTMENTS_USER";
const realmsSystem = "MEMORY_JS_REALMS_SYSTEM";
const realmsUser = "MEMORY_JS_REALMS_USER";
Cu.forceShrinkingGC();
Services.telemetry.gatherMemory();
let snapshot1 = Services.telemetry.getSnapshotForHistograms("main", true).parent;
// We can't hard code exact counts, but we can check some basic invariants:
//
// * Compartments must contain at least one realm, so there must be more
// realms than compartments.
// * There must be at least one system realm.
Assert.ok(snapshot1[realmsSystem].sum <= snapshot1[compsSystem].sum,
"Number of system compartments can't exceed number of system realms");
Assert.ok(snapshot1[realmsUser].sum <= snapshot1[compsUser].sum,
"Number of user compartments can't exceed number of user realms");
Assert.ok(snapshot1[realmsSystem].sum > 0,
"There must be at least one system realm");
// Now we create a bunch of sandboxes (more than one to be more resilient
// against GCs happening in the meantime), so we can check:
//
// * There are now more realms and user compartments than before. Not system
// compartments, because system realms share a compartment.
// * The system compartment contains multiple realms.
let systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
let arr = [];
for (let i = 0; i < 5; i++) {
arr.push(Cu.Sandbox(null));
arr.push(Cu.Sandbox(systemPrincipal));
}
Services.telemetry.gatherMemory();
let snapshot2 = Services.telemetry.getSnapshotForHistograms("main", true).parent;
for (let k of [realmsSystem, realmsUser, compsUser]) {
Assert.ok(snapshot2[k].sum > snapshot1[k].sum,
"There must be more compartments/realms now: " + k);
}
Assert.ok(snapshot2[realmsSystem].sum > snapshot2[compsSystem].sum,
"There must be more system realms than system compartments now");
arr[0].x = 10; // Ensure the JS engine keeps |arr| alive until this point.
});