/* 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"); });