86 lines
2.6 KiB
JavaScript
86 lines
2.6 KiB
JavaScript
/* 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/. */
|
|
"use strict";
|
|
|
|
Cu.importGlobalProperties(["ChromeUtils"]);
|
|
|
|
const {AddonTestUtils} = ChromeUtils.importESModule("resource://testing-common/AddonTestUtils.sys.mjs");
|
|
|
|
add_task(async function() {
|
|
const sandbox = Cu.Sandbox("http://example.com/");
|
|
|
|
function foo() {
|
|
return bar();
|
|
}
|
|
|
|
function bar() {
|
|
return baz();
|
|
}
|
|
|
|
function baz() {
|
|
return ChromeUtils.getCallerLocation(Cu.getObjectPrincipal(sandbox));
|
|
}
|
|
|
|
Cu.evalInSandbox(`
|
|
function it() {
|
|
// Use map() to throw a self-hosted frame on the stack, which we
|
|
// should filter out.
|
|
return [0].map(foo)[0];
|
|
}
|
|
function thing() {
|
|
return it();
|
|
}
|
|
`, sandbox, undefined, "thing.js");
|
|
|
|
Cu.exportFunction(foo, sandbox, {defineAs: "foo"});
|
|
|
|
let frame = sandbox.thing();
|
|
|
|
equal(frame.source, "thing.js", "Frame source");
|
|
equal(frame.line, 5, "Frame line");
|
|
equal(frame.column, 18, "Frame column");
|
|
equal(frame.functionDisplayName, "it", "Frame function name");
|
|
equal(frame.parent, null, "Frame parent");
|
|
|
|
equal(String(frame), "it@thing.js:5:18\n", "Stringified frame");
|
|
|
|
|
|
// reportError
|
|
|
|
let {messages} = await AddonTestUtils.promiseConsoleOutput(() => {
|
|
Cu.reportError("Meh", frame);
|
|
});
|
|
|
|
let [msg] = messages.filter(m => m.message.includes("Meh"));
|
|
|
|
equal(msg.stack, frame, "reportError stack frame");
|
|
equal(msg.message, '[JavaScript Error: "Meh" {file: "thing.js" line: 5}]\nit@thing.js:5:18\n');
|
|
|
|
Assert.throws(() => { Cu.reportError("Meh", {}); },
|
|
err => err.result == Cr.NS_ERROR_INVALID_ARG,
|
|
"reportError should throw when passed a non-SavedFrame object");
|
|
|
|
|
|
// createError
|
|
|
|
Assert.throws(() => { ChromeUtils.createError("Meh", {}); },
|
|
err => err.result == Cr.NS_ERROR_INVALID_ARG,
|
|
"createError should throw when passed a non-SavedFrame object");
|
|
|
|
let cloned = Cu.cloneInto(frame, sandbox);
|
|
let error = ChromeUtils.createError("Meh", cloned);
|
|
|
|
equal(String(cloned), String(frame),
|
|
"Cloning a SavedStack preserves its stringification");
|
|
|
|
equal(Cu.getGlobalForObject(error), sandbox,
|
|
"createError creates errors in the global of the SavedFrame");
|
|
equal(error.stack, String(cloned),
|
|
"createError creates errors with the correct stack");
|
|
|
|
equal(error.message, "Meh", "Error message");
|
|
equal(error.fileName, "thing.js", "Error filename");
|
|
equal(error.lineNumber, 5, "Error line");
|
|
equal(error.columnNumber, 18, "Error column");
|
|
});
|