121 lines
3.4 KiB
JavaScript
121 lines
3.4 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
// Test the ChromeUtils interface.
|
|
// eslint-disable-next-line
|
|
if (typeof Debugger != "function") {
|
|
const { addDebuggerToGlobal } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/jsdebugger.sys.mjs"
|
|
);
|
|
addDebuggerToGlobal(globalThis);
|
|
}
|
|
|
|
function run_test() {
|
|
ok(ChromeUtils, "Should be able to get the ChromeUtils interface");
|
|
|
|
testBadParameters();
|
|
testGoodParameters();
|
|
|
|
do_test_finished();
|
|
}
|
|
|
|
function testBadParameters() {
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot(),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if arguments aren't passed in."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot(null),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if boundaries isn't an object."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({}),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if the boundaries object doesn't have any properties."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({ runtime: true, globals: [this] }),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if the boundaries object has more than one property."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({ debugger: {} }),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if the debuggees object is not a Debugger object"
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({ globals: [{}] }),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if the globals array contains non-global objects."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({ runtime: false }),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if runtime is supplied and is not true."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({ globals: null }),
|
|
/TypeError:.*can't be converted to a sequence/,
|
|
"Should throw if globals is not an object."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({ globals: {} }),
|
|
/TypeError:.*can't be converted to a sequence/,
|
|
"Should throw if globals is not an array."
|
|
);
|
|
|
|
Assert.throws(
|
|
() => ChromeUtils.saveHeapSnapshot({ debugger: Debugger.prototype }),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if debugger is the Debugger.prototype object."
|
|
);
|
|
|
|
Assert.throws(
|
|
() =>
|
|
ChromeUtils.saveHeapSnapshot({
|
|
get globals() {
|
|
return [this];
|
|
},
|
|
}),
|
|
/NS_ERROR_ILLEGAL_VALUE/,
|
|
"Should throw if boundaries property is a getter."
|
|
);
|
|
}
|
|
|
|
const makeNewSandbox = () =>
|
|
Cu.Sandbox(CC("@mozilla.org/systemprincipal;1", "nsIPrincipal")());
|
|
|
|
function testGoodParameters() {
|
|
const sandbox = makeNewSandbox();
|
|
let dbg = new Debugger(sandbox);
|
|
|
|
ChromeUtils.saveHeapSnapshot({ debugger: dbg });
|
|
ok(true, "Should be able to save a snapshot for a debuggee global.");
|
|
|
|
dbg = new Debugger();
|
|
const sandboxes = Array(10).fill(null).map(makeNewSandbox);
|
|
sandboxes.forEach(sb => dbg.addDebuggee(sb));
|
|
|
|
ChromeUtils.saveHeapSnapshot({ debugger: dbg });
|
|
ok(true, "Should be able to save a snapshot for many debuggee globals.");
|
|
|
|
dbg = new Debugger();
|
|
ChromeUtils.saveHeapSnapshot({ debugger: dbg });
|
|
ok(true, "Should be able to save a snapshot with no debuggee globals.");
|
|
|
|
ChromeUtils.saveHeapSnapshot({ globals: [this] });
|
|
ok(true, "Should be able to save a snapshot for a specific global.");
|
|
|
|
ChromeUtils.saveHeapSnapshot({ runtime: true });
|
|
ok(true, "Should be able to save a snapshot of the full runtime.");
|
|
}
|