Skip to content

Commit 5869b0e

Browse files
committed
prevent our loggers from throwing their own errors in a few more cases
1 parent 6de0042 commit 5869b0e

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

Diff for: src/lib/loggers.js

+16-4
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,24 @@ loggers.error = function() {
6161
* apply like other functions do
6262
*/
6363
function apply(f, args) {
64-
if(f.apply) {
65-
f.apply(f, args);
64+
if(f && f.apply) {
65+
try {
66+
// `this` should always be console, since here we're always
67+
// applying a method of the console object.
68+
f.apply(console, args);
69+
return;
70+
}
71+
catch(e) { /* in case apply failed, fall back on the code below */ }
6672
}
67-
else {
68-
for(var i = 0; i < args.length; i++) {
73+
74+
// no apply - just try calling the function on each arg independently
75+
for(var i = 0; i < args.length; i++) {
76+
try {
6977
f(args[i]);
7078
}
79+
catch(e) {
80+
// still fails - last resort simple console.log
81+
console.log(args[i]);
82+
}
7183
}
7284
}

Diff for: test/jasmine/tests/lib_test.js

+25-7
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,7 @@ describe('Test lib.js:', function() {
16541654

16551655
function consoleFn(name, hasApply, messages) {
16561656
var out = function() {
1657+
if(hasApply) expect(this).toBe(window.console);
16571658
var args = [];
16581659
for(var i = 0; i < arguments.length; i++) args.push(arguments[i]);
16591660
messages.push([name, args]);
@@ -1664,12 +1665,13 @@ describe('Test lib.js:', function() {
16641665
return out;
16651666
}
16661667

1667-
function mockConsole(hasApply, hasTrace) {
1668+
function mockConsole(hasApply, hasTrace, hasError) {
16681669
var out = {
16691670
MESSAGES: []
16701671
};
16711672
out.log = consoleFn('log', hasApply, out.MESSAGES);
1672-
out.error = consoleFn('error', hasApply, out.MESSAGES);
1673+
1674+
if(hasError) out.error = consoleFn('error', hasApply, out.MESSAGES);
16731675

16741676
if(hasTrace) out.trace = consoleFn('trace', hasApply, out.MESSAGES);
16751677

@@ -1687,7 +1689,7 @@ describe('Test lib.js:', function() {
16871689
});
16881690

16891691
it('emits one console message if apply is available', function() {
1690-
var c = window.console = mockConsole(true, true);
1692+
var c = window.console = mockConsole(true, true, true);
16911693
config.logging = 2;
16921694

16931695
Lib.log('tick', 'tock', 'tick', 'tock', 1);
@@ -1702,7 +1704,7 @@ describe('Test lib.js:', function() {
17021704
});
17031705

17041706
it('falls back on console.log if no trace', function() {
1705-
var c = window.console = mockConsole(true, false);
1707+
var c = window.console = mockConsole(true, false, true);
17061708
config.logging = 2;
17071709

17081710
Lib.log('Hi');
@@ -1715,7 +1717,7 @@ describe('Test lib.js:', function() {
17151717
});
17161718

17171719
it('falls back on separate calls if no apply', function() {
1718-
var c = window.console = mockConsole(false, false);
1720+
var c = window.console = mockConsole(false, false, true);
17191721
config.logging = 2;
17201722

17211723
Lib.log('tick', 'tock', 'tick', 'tock', 1);
@@ -1744,7 +1746,7 @@ describe('Test lib.js:', function() {
17441746
});
17451747

17461748
it('omits .log at log level 1', function() {
1747-
var c = window.console = mockConsole(true, true);
1749+
var c = window.console = mockConsole(true, true, true);
17481750
config.logging = 1;
17491751

17501752
Lib.log(1);
@@ -1758,7 +1760,7 @@ describe('Test lib.js:', function() {
17581760
});
17591761

17601762
it('logs nothing at log level 0', function() {
1761-
var c = window.console = mockConsole(true, true);
1763+
var c = window.console = mockConsole(true, true, true);
17621764
config.logging = 0;
17631765

17641766
Lib.log(1);
@@ -1767,6 +1769,22 @@ describe('Test lib.js:', function() {
17671769

17681770
expect(c.MESSAGES).toEqual([]);
17691771
});
1772+
1773+
it('falls back on simple log if there is no console.error', function() {
1774+
// TODO
1775+
1776+
var c = window.console = mockConsole(true, true, false);
1777+
config.logging = 2;
1778+
1779+
Lib.error('who are you', 'who who... are you', {a: 1, b: 2});
1780+
1781+
expect(c.MESSAGES).toEqual([
1782+
['log', ['ERROR:']],
1783+
['log', ['who are you']],
1784+
['log', ['who who... are you']],
1785+
['log', [{a: 1, b: 2}]]
1786+
]);
1787+
});
17701788
});
17711789

17721790
describe('keyedContainer', function() {

0 commit comments

Comments
 (0)