<!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 = Components.classes; var Ci = Components.interfaces; var Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); SimpleTest.waitForExplicitFinish(); SimpleTest.expectUncaughtException(); // /!\ Line number is important in this test, // we are asserting the following functions line # function failingStack() { nestedFunction(); } function nestedFunction() { doesntExistsAndThrow(); } var TestObserver = { QueryInterface: XPCOMUtils.generateQI([Ci.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.indexOf("test_nsScriptErrorWithStack.html") !== -1, "source is correct"); is(s.line, 23, "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.indexOf("test_nsScriptErrorWithStack.html") !== -1, "source is correct"); is(s.line, 20, "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>