aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Minar2012-03-19 11:15:09 -0700
committerIgor Minar2012-03-20 11:07:36 -0700
commit15213ec212769837cb2b7e781ffc5bfd598d27ca (patch)
treec602f2019f4cf66efbb47004fa641ab1de4da53c
parent9171c76bb4951b5ad6449ff9d0b658f2d390f784 (diff)
downloadangular.js-15213ec212769837cb2b7e781ffc5bfd598d27ca.tar.bz2
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
-rw-r--r--src/service/log.js16
-rw-r--r--test/service/logSpec.js35
2 files changed, 39 insertions, 12 deletions
diff --git a/src/service/log.js b/src/service/log.js
index d338985a..d9d8994d 100644
--- a/src/service/log.js
+++ b/src/service/log.js
@@ -93,19 +93,23 @@ function $LogProvider(){
}
function consoleLog(type) {
- var console = $window.console || {};
- var logFn = console[type] || console.log || noop;
+ var console = $window.console || {},
+ logFn = console[type] || console.log || noop;
+
if (logFn.apply) {
return function() {
var args = [];
- forEach(arguments, function(arg){
+ forEach(arguments, function(arg) {
args.push(formatError(arg));
});
return logFn.apply(console, args);
};
- } else {
- // we are IE, in which case there is nothing we can do
- return logFn;
+ }
+
+ // we are IE which either doesn't have window.console => this is noop and we do nothing,
+ // or we are IE where console.log doesn't have apply so we log at least first 2 args
+ return function(arg1, arg2) {
+ logFn(arg1, arg2);
}
}
}];
diff --git a/test/service/logSpec.js b/test/service/logSpec.js
index 72ce6a5c..269057a2 100644
--- a/test/service/logSpec.js
+++ b/test/service/logSpec.js
@@ -1,17 +1,18 @@
'use strict';
describe('$log', function() {
- var $window;
- var logger;
+ var $window, logger, log, warn, info, error;
+
- function log() { logger+= 'log;'; }
- function warn() { logger+= 'warn;'; }
- function info() { logger+= 'info;'; }
- function error() { logger+= 'error;'; }
beforeEach(module(function($provide){
$window = {};
logger = '';
+ log = function() { logger+= 'log;'; };
+ warn = function() { logger+= 'warn;'; };
+ info = function() { logger+= 'info;'; };
+ error = function() { logger+= 'error;'; };
+
$provide.provider('$log', $LogProvider);
$provide.value('$exceptionHandler', angular.mock.rethrow);
$provide.value('$window', $window);
@@ -58,6 +59,28 @@ describe('$log', function() {
));
+ it("should work in IE where console.error doesn't have apply method", inject(
+ function() {
+ log.apply = log.call =
+ warn.apply = warn.call =
+ info.apply = info.call =
+ error.apply = error.call = null;
+
+ $window.console = {log: log,
+ warn: warn,
+ info: info,
+ error: error};
+ },
+ function($log) {
+ $log.log.apply($log);
+ $log.warn.apply($log);
+ $log.info.apply($log);
+ $log.error.apply($log);
+ expect(logger).toEqual('log;warn;info;error;');
+ })
+ );
+
+
describe('$log.error', function() {
var e, $log, errorArgs;