diff options
Diffstat (limited to 'mobile/android/chrome/content/ConsoleAPI.js')
-rw-r--r-- | mobile/android/chrome/content/ConsoleAPI.js | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/mobile/android/chrome/content/ConsoleAPI.js b/mobile/android/chrome/content/ConsoleAPI.js new file mode 100644 index 000000000..6ba4c1195 --- /dev/null +++ b/mobile/android/chrome/content/ConsoleAPI.js @@ -0,0 +1,96 @@ +/* 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"; + +var ConsoleAPI = { + observe: function observe(aMessage, aTopic, aData) { + aMessage = aMessage.wrappedJSObject; + + let mappedArguments = Array.map(aMessage.arguments, this.formatResult, this); + let joinedArguments = Array.join(mappedArguments, " "); + + if (aMessage.level == "error" || aMessage.level == "warn") { + let flag = (aMessage.level == "error" ? Ci.nsIScriptError.errorFlag : Ci.nsIScriptError.warningFlag); + let consoleMsg = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError); + consoleMsg.init(joinedArguments, null, null, 0, 0, flag, "content javascript"); + Services.console.logMessage(consoleMsg); + } else if (aMessage.level == "trace") { + let bundle = Services.strings.createBundle("chrome://browser/locale/browser.properties"); + let args = aMessage.arguments; + let filename = this.abbreviateSourceURL(args[0].filename); + let functionName = args[0].functionName || bundle.GetStringFromName("stacktrace.anonymousFunction"); + let lineNumber = args[0].lineNumber; + + let body = bundle.formatStringFromName("stacktrace.outputMessage", [filename, functionName, lineNumber], 3); + body += "\n"; + args.forEach(function(aFrame) { + let functionName = aFrame.functionName || bundle.GetStringFromName("stacktrace.anonymousFunction"); + body += " " + aFrame.filename + " :: " + functionName + " :: " + aFrame.lineNumber + "\n"; + }); + + Services.console.logStringMessage(body); + } else if (aMessage.level == "time" && aMessage.arguments) { + let bundle = Services.strings.createBundle("chrome://browser/locale/browser.properties"); + let body = bundle.formatStringFromName("timer.start", [aMessage.arguments.name], 1); + Services.console.logStringMessage(body); + } else if (aMessage.level == "timeEnd" && aMessage.arguments) { + let bundle = Services.strings.createBundle("chrome://browser/locale/browser.properties"); + let body = bundle.formatStringFromName("timer.end", [aMessage.arguments.name, aMessage.arguments.duration], 2); + Services.console.logStringMessage(body); + } else if (["group", "groupCollapsed", "groupEnd"].indexOf(aMessage.level) != -1) { + // Do nothing yet + } else { + Services.console.logStringMessage(joinedArguments); + } + }, + + getResultType: function getResultType(aResult) { + let type = aResult === null ? "null" : typeof aResult; + if (type == "object" && aResult.constructor && aResult.constructor.name) + type = aResult.constructor.name; + return type.toLowerCase(); + }, + + formatResult: function formatResult(aResult) { + let output = ""; + let type = this.getResultType(aResult); + switch (type) { + case "string": + case "boolean": + case "date": + case "error": + case "number": + case "regexp": + output = aResult.toString(); + break; + case "null": + case "undefined": + output = type; + break; + default: + output = aResult.toString(); + break; + } + + return output; + }, + + abbreviateSourceURL: function abbreviateSourceURL(aSourceURL) { + // Remove any query parameters. + let hookIndex = aSourceURL.indexOf("?"); + if (hookIndex > -1) + aSourceURL = aSourceURL.substring(0, hookIndex); + + // Remove a trailing "/". + if (aSourceURL[aSourceURL.length - 1] == "/") + aSourceURL = aSourceURL.substring(0, aSourceURL.length - 1); + + // Remove all but the last path component. + let slashIndex = aSourceURL.lastIndexOf("/"); + if (slashIndex > -1) + aSourceURL = aSourceURL.substring(slashIndex + 1); + + return aSourceURL; + } +}; |