Skip to content

Commit ad97336

Browse files
committed
fix($log): avoid console.log.apply calls in IE
In IE window.console.log and friends are functions that don't have apply or call fns. For this reason we have to treat them specially and do our best to log at least something when running in this browser. Closes angular#805
1 parent 64660cf commit ad97336

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

src/service/log.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,23 @@ function $LogProvider(){
9393
}
9494

9595
function consoleLog(type) {
96-
var console = $window.console || {};
97-
var logFn = console[type] || console.log || noop;
96+
var console = $window.console || {},
97+
logFn = console[type] || console.log || noop;
98+
9899
if (logFn.apply) {
99100
return function() {
100101
var args = [];
101-
forEach(arguments, function(arg){
102+
forEach(arguments, function(arg) {
102103
args.push(formatError(arg));
103104
});
104105
return logFn.apply(console, args);
105106
};
106-
} else {
107-
// we are IE, in which case there is nothing we can do
108-
return logFn;
107+
}
108+
109+
// we are IE which either doesn't have window.console => this is noop and we do nothing,
110+
// or we are IE where console.log doesn't have apply so we log at least first 2 args
111+
return function(arg1, arg2) {
112+
logFn(arg1, arg2);
109113
}
110114
}
111115
}];

test/service/logSpec.js

+29-6
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
'use strict';
22

33
describe('$log', function() {
4-
var $window;
5-
var logger;
4+
var $window, logger, log, warn, info, error;
5+
66

7-
function log() { logger+= 'log;'; }
8-
function warn() { logger+= 'warn;'; }
9-
function info() { logger+= 'info;'; }
10-
function error() { logger+= 'error;'; }
117

128
beforeEach(module(function($provide){
139
$window = {};
1410
logger = '';
11+
log = function() { logger+= 'log;'; };
12+
warn = function() { logger+= 'warn;'; };
13+
info = function() { logger+= 'info;'; };
14+
error = function() { logger+= 'error;'; };
15+
1516
$provide.provider('$log', $LogProvider);
1617
$provide.value('$exceptionHandler', angular.mock.rethrow);
1718
$provide.value('$window', $window);
@@ -58,6 +59,28 @@ describe('$log', function() {
5859
));
5960

6061

62+
it("should work in IE where console.error doesn't have apply method", inject(
63+
function() {
64+
log.apply = log.call =
65+
warn.apply = warn.call =
66+
info.apply = info.call =
67+
error.apply = error.call = null;
68+
69+
$window.console = {log: log,
70+
warn: warn,
71+
info: info,
72+
error: error};
73+
},
74+
function($log) {
75+
$log.log.apply($log);
76+
$log.warn.apply($log);
77+
$log.info.apply($log);
78+
$log.error.apply($log);
79+
expect(logger).toEqual('log;warn;info;error;');
80+
})
81+
);
82+
83+
6184
describe('$log.error', function() {
6285
var e, $log, errorArgs;
6386

0 commit comments

Comments
 (0)