273 lines
8.6 KiB
JavaScript
273 lines
8.6 KiB
JavaScript
|
/*!
|
||
|
* JavaScript Debug - v0.4 - 6/22/2010
|
||
|
* http://benalman.com/projects/javascript-debug-console-log/
|
||
|
*
|
||
|
* Copyright (c) 2010 "Cowboy" Ben Alman
|
||
|
* Dual licensed under the MIT and GPL licenses.
|
||
|
* http://benalman.com/about/license/
|
||
|
*
|
||
|
* With lots of help from Paul Irish!
|
||
|
* http://paulirish.com/
|
||
|
*/
|
||
|
|
||
|
// Script: JavaScript Debug: A simple wrapper for console.log
|
||
|
//
|
||
|
// *Version: 0.4, Last Updated: 6/22/2010*
|
||
|
//
|
||
|
// Tested with Internet Explorer 6-8, Firefox 3-3.6, Safari 3-4, Chrome 3-5, Opera 9.6-10.5
|
||
|
//
|
||
|
// Home - http://benalman.com/projects/javascript-debug-console-log/
|
||
|
// GitHub - http://github.com/cowboy/javascript-debug/
|
||
|
// Source - http://github.com/cowboy/javascript-debug/raw/master/ba-debug.js
|
||
|
// (Minified) - http://github.com/cowboy/javascript-debug/raw/master/ba-debug.min.js (1.1kb)
|
||
|
//
|
||
|
// About: License
|
||
|
//
|
||
|
// Copyright (c) 2010 "Cowboy" Ben Alman,
|
||
|
// Dual licensed under the MIT and GPL licenses.
|
||
|
// http://benalman.com/about/license/
|
||
|
//
|
||
|
// About: Support and Testing
|
||
|
//
|
||
|
// Information about what browsers this code has been tested in.
|
||
|
//
|
||
|
// Browsers Tested - Internet Explorer 6-8, Firefox 3-3.6, Safari 3-4, Chrome
|
||
|
// 3-5, Opera 9.6-10.5
|
||
|
//
|
||
|
// About: Examples
|
||
|
//
|
||
|
// These working examples, complete with fully commented code, illustrate a few
|
||
|
// ways in which this plugin can be used.
|
||
|
//
|
||
|
// Examples - http://benalman.com/code/projects/javascript-debug/examples/debug/
|
||
|
//
|
||
|
// About: Revision History
|
||
|
//
|
||
|
// 0.4 - (6/22/2010) Added missing passthrough methods: exception,
|
||
|
// groupCollapsed, table
|
||
|
// 0.3 - (6/8/2009) Initial release
|
||
|
//
|
||
|
// Topic: Pass-through console methods
|
||
|
//
|
||
|
// assert, clear, count, dir, dirxml, exception, group, groupCollapsed,
|
||
|
// groupEnd, profile, profileEnd, table, time, timeEnd, trace
|
||
|
//
|
||
|
// These console methods are passed through (but only if both the console and
|
||
|
// the method exists), so use them without fear of reprisal. Note that these
|
||
|
// methods will not be passed through if the logging level is set to 0 via
|
||
|
// <debug.setLevel>.
|
||
|
(function(define, console) {
|
||
|
define(function() { "use strict";
|
||
|
// Some convenient shortcuts.
|
||
|
var aps = Array.prototype.slice,
|
||
|
con = console,
|
||
|
|
||
|
// Public object to be returned.
|
||
|
that = {},
|
||
|
|
||
|
callback_func,
|
||
|
callback_force,
|
||
|
|
||
|
// Default logging level, show everything.
|
||
|
log_level = 9,
|
||
|
|
||
|
// Logging methods, in "priority order". Not all console implementations
|
||
|
// will utilize these, but they will be used in the callback passed to
|
||
|
// setCallback.
|
||
|
log_methods = [ 'error', 'warn', 'info', 'debug', 'log' ],
|
||
|
|
||
|
// Pass these methods through to the console if they exist, otherwise just
|
||
|
// fail gracefully. These methods are provided for convenience.
|
||
|
pass_methods = 'assert clear count dir dirxml exception group groupCollapsed groupEnd profile profileEnd table time timeEnd trace'.split(' '),
|
||
|
idx = pass_methods.length,
|
||
|
|
||
|
// Logs are stored here so that they can be recalled as necessary.
|
||
|
logs = [];
|
||
|
|
||
|
while ( --idx >= 0 ) {
|
||
|
(function( method ){
|
||
|
|
||
|
// Generate pass-through methods. These methods will be called, if they
|
||
|
// exist, as long as the logging level is non-zero.
|
||
|
that[ method ] = function() {
|
||
|
log_level !== 0 && con && con[ method ]
|
||
|
&& con[ method ].apply( con, arguments );
|
||
|
}
|
||
|
|
||
|
})( pass_methods[idx] );
|
||
|
}
|
||
|
|
||
|
idx = log_methods.length;
|
||
|
while ( --idx >= 0 ) {
|
||
|
(function( idx, level ){
|
||
|
|
||
|
// Method: debug.log
|
||
|
//
|
||
|
// Call the console.log method if available. Adds an entry into the logs
|
||
|
// array for a callback specified via <debug.setCallback>.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// debug.log( object [, object, ...] ); - -
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// object - (Object) Any valid JavaScript object.
|
||
|
|
||
|
// Method: debug.debug
|
||
|
//
|
||
|
// Call the console.debug method if available, otherwise call console.log.
|
||
|
// Adds an entry into the logs array for a callback specified via
|
||
|
// <debug.setCallback>.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// debug.debug( object [, object, ...] ); - -
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// object - (Object) Any valid JavaScript object.
|
||
|
|
||
|
// Method: debug.info
|
||
|
//
|
||
|
// Call the console.info method if available, otherwise call console.log.
|
||
|
// Adds an entry into the logs array for a callback specified via
|
||
|
// <debug.setCallback>.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// debug.info( object [, object, ...] ); - -
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// object - (Object) Any valid JavaScript object.
|
||
|
|
||
|
// Method: debug.warn
|
||
|
//
|
||
|
// Call the console.warn method if available, otherwise call console.log.
|
||
|
// Adds an entry into the logs array for a callback specified via
|
||
|
// <debug.setCallback>.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// debug.warn( object [, object, ...] ); - -
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// object - (Object) Any valid JavaScript object.
|
||
|
|
||
|
// Method: debug.error
|
||
|
//
|
||
|
// Call the console.error method if available, otherwise call console.log.
|
||
|
// Adds an entry into the logs array for a callback specified via
|
||
|
// <debug.setCallback>.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// debug.error( object [, object, ...] ); - -
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// object - (Object) Any valid JavaScript object.
|
||
|
|
||
|
that[ level ] = function() {
|
||
|
var args = aps.call( arguments ),
|
||
|
log_arr = [ level ].concat( args );
|
||
|
|
||
|
logs.push( log_arr );
|
||
|
exec_callback( log_arr );
|
||
|
|
||
|
if ( !con || !is_level( idx ) ) { return; }
|
||
|
|
||
|
con.firebug ? con[ level ].apply( window, args )
|
||
|
: con[ level ] ? con[ level ].apply( window, args )
|
||
|
: con.log.apply( window, args );
|
||
|
};
|
||
|
|
||
|
})( idx, log_methods[idx] );
|
||
|
}
|
||
|
|
||
|
// Execute the callback function if set.
|
||
|
function exec_callback( args ) {
|
||
|
if ( callback_func && (callback_force || !con || !con.log) ) {
|
||
|
callback_func.apply( window, args );
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Method: debug.setLevel
|
||
|
//
|
||
|
// Set a minimum or maximum logging level for the console. Doesn't affect
|
||
|
// the <debug.setCallback> callback function, but if set to 0 to disable
|
||
|
// logging, <Pass-through console methods> will be disabled as well.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// debug.setLevel( [ level ] ) - -
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// level - (Number) If 0, disables logging. If negative, shows N lowest
|
||
|
// priority levels of log messages. If positive, shows N highest priority
|
||
|
// levels of log messages.
|
||
|
//
|
||
|
// Priority levels:
|
||
|
//
|
||
|
// log (1) < debug (2) < info (3) < warn (4) < error (5)
|
||
|
|
||
|
that.setLevel = function( level ) {
|
||
|
log_level = typeof level === 'number' ? level : 9;
|
||
|
};
|
||
|
|
||
|
// Determine if the level is visible given the current log_level.
|
||
|
function is_level( level ) {
|
||
|
return log_level > 0
|
||
|
? log_level > level
|
||
|
: log_methods.length + log_level <= level;
|
||
|
};
|
||
|
|
||
|
// Method: debug.setCallback
|
||
|
//
|
||
|
// Set a callback to be used if logging isn't possible due to console.log
|
||
|
// not existing. If unlogged logs exist when callback is set, they will all
|
||
|
// be logged immediately unless a limit is specified.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// debug.setCallback( callback [, force ] [, limit ] )
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// callback - (Function) The aforementioned callback function. The first
|
||
|
// argument is the logging level, and all subsequent arguments are those
|
||
|
// passed to the initial debug logging method.
|
||
|
// force - (Boolean) If false, log to console.log if available, otherwise
|
||
|
// callback. If true, log to both console.log and callback.
|
||
|
// limit - (Number) If specified, number of lines to limit initial scrollback
|
||
|
// to.
|
||
|
|
||
|
that.setCallback = function() {
|
||
|
var args = aps.call( arguments ),
|
||
|
max = logs.length,
|
||
|
i = max;
|
||
|
|
||
|
callback_func = args.shift() || null;
|
||
|
callback_force = typeof args[0] === 'boolean' ? args.shift() : false;
|
||
|
|
||
|
i -= typeof args[0] === 'number' ? args.shift() : max;
|
||
|
|
||
|
while ( i < max ) {
|
||
|
exec_callback( logs[i++] );
|
||
|
}
|
||
|
};
|
||
|
|
||
|
return that;
|
||
|
});
|
||
|
})(typeof define == 'function'
|
||
|
? define
|
||
|
: function (factory) { typeof exports != 'undefined'
|
||
|
? (module.exports = factory())
|
||
|
: (this.when = factory());
|
||
|
},
|
||
|
window.console
|
||
|
// Boilerplate for AMD, Node, and browser global
|
||
|
);
|