diff options
Diffstat (limited to 'toolkit/modules/debug.js')
-rw-r--r-- | toolkit/modules/debug.js | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/toolkit/modules/debug.js b/toolkit/modules/debug.js new file mode 100644 index 000000000..de26ce6ff --- /dev/null +++ b/toolkit/modules/debug.js @@ -0,0 +1,79 @@ +/* vim:set ts=2 sw=2 sts=2 ci et: */ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + +/* 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/. */ + +// This file contains functions that are useful for debugging purposes from +// within JavaScript code. + +this.EXPORTED_SYMBOLS = ["NS_ASSERT"]; + +var gTraceOnAssert = true; + +/** + * This function provides a simple assertion function for JavaScript. + * If the condition is true, this function will do nothing. If the + * condition is false, then the message will be printed to the console + * and an alert will appear showing a stack trace, so that the (alpha + * or nightly) user can file a bug containing it. For future enhancements, + * see bugs 330077 and 330078. + * + * To suppress the dialogs, you can run with the environment variable + * XUL_ASSERT_PROMPT set to 0 (if unset, this defaults to 1). + * + * @param condition represents the condition that we're asserting to be + * true when we call this function--should be + * something that can be evaluated as a boolean. + * @param message a string to be displayed upon failure of the assertion + */ + +this.NS_ASSERT = function NS_ASSERT(condition, message) { + if (condition) + return; + + var releaseBuild = true; + var defB = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefService) + .getDefaultBranch(null); + try { + switch (defB.getCharPref("app.update.channel")) { + case "nightly": + case "aurora": + case "beta": + case "default": + releaseBuild = false; + } + } catch (ex) {} + + var caller = arguments.callee.caller; + var assertionText = "ASSERT: " + message + "\n"; + + // Report the error to the console + Components.utils.reportError(assertionText); + + if (releaseBuild) { + return; + } + + // dump the stack to stdout too in non-release builds + var stackText = ""; + if (gTraceOnAssert) { + stackText = "Stack Trace: \n"; + var count = 0; + while (caller) { + stackText += count++ + ":" + caller.name + "("; + for (var i = 0; i < caller.arguments.length; ++i) { + var arg = caller.arguments[i]; + stackText += arg; + if (i < caller.arguments.length - 1) + stackText += ","; + } + stackText += ")\n"; + caller = caller.arguments.callee.caller; + } + } + + dump(assertionText + stackText); +} |