1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
/* 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.");
}
|