<!DOCTYPE html> <meta charset=utf-8> <title>Test for 814497</title> <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> <div id="log"></div> <script> var c = Cc; SimpleTest.waitForExplicitFinish(); SimpleTest.expectUncaughtException(); // /!\ Line number is important in this test, // we are asserting the following functions line # function failingStack() { nestedFunction(); } function nestedFunction() { // eslint-disable-next-line no-undef doesntExistsAndThrow(); } var TestObserver = { QueryInterface: ChromeUtils.generateQI(["nsIObserver"]), observe: function test_observe(aSubject) { if (!(aSubject instanceof Ci.nsIScriptError)) { return; } dump("stack: "+aSubject.stack+"\n"); // Main assertions var s = aSubject.stack; ok(!!s, "has first frame"); ok(s.source.includes("test_nsScriptErrorWithStack.html"), "source is correct"); is(s.line, 19, "line is correct"); is(s.column, 5, "column is correct"); is(s.functionDisplayName, "nestedFunction"); s = s.parent; ok(!!s, "has second frame"); ok(s.source.includes("test_nsScriptErrorWithStack.html"), "source is correct"); is(s.line, 15, "line is correct"); is(s.column, 5, "column is correct"); is(s.functionDisplayName, "failingStack"); // We shouldn't have any more frame as we used setTimeout ok(!s.parent, "has no more frames"); // Cleanup Services.console.unregisterListener(TestObserver); SimpleTest.finish(); } }; Services.console.registerListener(TestObserver); // use setTimeout in order to prevent throwing from test frame // and so have a clean stack frame with just our method calls setTimeout(failingStack, 0); </script>