diff -r 000000000000 -r 6474c204b198 toolkit/modules/debug.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/modules/debug.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,80 @@ +/* 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 "alpha": + 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); +}