diff --git a/src/lib/loggers.js b/src/lib/loggers.js index 80d2a307197..02be37218d2 100644 --- a/src/lib/loggers.js +++ b/src/lib/loggers.js @@ -61,12 +61,24 @@ loggers.error = function() { * apply like other functions do */ function apply(f, args) { - if(f.apply) { - f.apply(f, args); + if(f && f.apply) { + try { + // `this` should always be console, since here we're always + // applying a method of the console object. + f.apply(console, args); + return; + } + catch(e) { /* in case apply failed, fall back on the code below */ } } - else { - for(var i = 0; i < args.length; i++) { + + // no apply - just try calling the function on each arg independently + for(var i = 0; i < args.length; i++) { + try { f(args[i]); } + catch(e) { + // still fails - last resort simple console.log + console.log(args[i]); + } } } diff --git a/test/jasmine/tests/lib_test.js b/test/jasmine/tests/lib_test.js index 3dde0f81c7a..6653cc9d46f 100644 --- a/test/jasmine/tests/lib_test.js +++ b/test/jasmine/tests/lib_test.js @@ -1654,6 +1654,7 @@ describe('Test lib.js:', function() { function consoleFn(name, hasApply, messages) { var out = function() { + if(hasApply) expect(this).toBe(window.console); var args = []; for(var i = 0; i < arguments.length; i++) args.push(arguments[i]); messages.push([name, args]); @@ -1664,12 +1665,13 @@ describe('Test lib.js:', function() { return out; } - function mockConsole(hasApply, hasTrace) { + function mockConsole(hasApply, hasTrace, hasError) { var out = { MESSAGES: [] }; out.log = consoleFn('log', hasApply, out.MESSAGES); - out.error = consoleFn('error', hasApply, out.MESSAGES); + + if(hasError) out.error = consoleFn('error', hasApply, out.MESSAGES); if(hasTrace) out.trace = consoleFn('trace', hasApply, out.MESSAGES); @@ -1687,7 +1689,7 @@ describe('Test lib.js:', function() { }); it('emits one console message if apply is available', function() { - var c = window.console = mockConsole(true, true); + var c = window.console = mockConsole(true, true, true); config.logging = 2; Lib.log('tick', 'tock', 'tick', 'tock', 1); @@ -1702,7 +1704,7 @@ describe('Test lib.js:', function() { }); it('falls back on console.log if no trace', function() { - var c = window.console = mockConsole(true, false); + var c = window.console = mockConsole(true, false, true); config.logging = 2; Lib.log('Hi'); @@ -1715,7 +1717,7 @@ describe('Test lib.js:', function() { }); it('falls back on separate calls if no apply', function() { - var c = window.console = mockConsole(false, false); + var c = window.console = mockConsole(false, false, true); config.logging = 2; Lib.log('tick', 'tock', 'tick', 'tock', 1); @@ -1744,7 +1746,7 @@ describe('Test lib.js:', function() { }); it('omits .log at log level 1', function() { - var c = window.console = mockConsole(true, true); + var c = window.console = mockConsole(true, true, true); config.logging = 1; Lib.log(1); @@ -1758,7 +1760,7 @@ describe('Test lib.js:', function() { }); it('logs nothing at log level 0', function() { - var c = window.console = mockConsole(true, true); + var c = window.console = mockConsole(true, true, true); config.logging = 0; Lib.log(1); @@ -1767,6 +1769,22 @@ describe('Test lib.js:', function() { expect(c.MESSAGES).toEqual([]); }); + + it('falls back on simple log if there is no console.error', function() { + // TODO + + var c = window.console = mockConsole(true, true, false); + config.logging = 2; + + Lib.error('who are you', 'who who... are you', {a: 1, b: 2}); + + expect(c.MESSAGES).toEqual([ + ['log', ['ERROR:']], + ['log', ['who are you']], + ['log', ['who who... are you']], + ['log', [{a: 1, b: 2}]] + ]); + }); }); describe('keyedContainer', function() {