Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 15213ec

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 #805
1 parent 9171c76 commit 15213ec

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

Diff for: 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
}];

Diff for: 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)