Skip to content

Commit f92ff9d

Browse files
committed
Preserve original console methods (fixes #373)
1 parent fb26b90 commit f92ff9d

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

src/raven.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,15 @@ var _Raven = window.Raven,
2626
authQueryString,
2727
isRavenInstalled = false,
2828
objectPrototype = Object.prototype,
29-
// capture a reference to window.console first before
30-
// the console plugin has a chance to monkey patch
29+
// capture references to window.console *and* all its methods first
30+
// before the console plugin has a chance to monkey patch
3131
originalConsole = window.console || {},
32+
originalConsoleMethods = {},
3233
startTime = now();
3334

35+
for (var method in originalConsole) {
36+
originalConsoleMethods[method] = originalConsole[method];
37+
}
3438
/*
3539
* The core Raven singleton
3640
*
@@ -852,10 +856,10 @@ function uuid4() {
852856
}
853857

854858
function logDebug(level) {
855-
if (originalConsole[level] && Raven.debug) {
859+
if (originalConsoleMethods[level] && Raven.debug) {
856860
// _slice is coming from vendor/TraceKit/tracekit.js
857861
// so it's accessible globally
858-
originalConsole[level].apply(originalConsole, _slice.call(arguments, 1));
862+
originalConsoleMethods[level].apply(originalConsole, _slice.call(arguments, 1));
859863
}
860864
}
861865

test/raven.test.js

+20-5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ function flushRavenState() {
2222
startTime = 0;
2323
ravenNotConfiguredError = undefined;
2424
originalConsole = window.console || {};
25+
originalConsoleMethods = {};
26+
27+
for (var method in originalConsole) {
28+
originalConsoleMethods[method] = originalConsole[method];
29+
}
2530

2631
Raven.uninstall();
2732
}
@@ -326,23 +331,33 @@ describe('globals', function() {
326331

327332
it('should not write to console when Raven.debug is false', function() {
328333
Raven.debug = false;
329-
this.sinon.stub(originalConsole, level);
334+
this.sinon.stub(originalConsoleMethods, level);
330335
logDebug(level, message);
331-
assert.isFalse(originalConsole[level].called);
336+
assert.isFalse(originalConsoleMethods[level].called);
332337
});
333338

334339
it('should write to console when Raven.debug is true', function() {
335340
Raven.debug = true;
336-
this.sinon.stub(originalConsole, level);
341+
this.sinon.stub(originalConsoleMethods, level);
337342
logDebug(level, message);
338-
assert.isTrue(originalConsole[level].calledOnce);
343+
assert.isTrue(originalConsoleMethods[level].calledOnce);
339344
});
340345

341346
it('should handle variadic arguments', function() {
342347
Raven.debug = true;
343-
this.sinon.stub(originalConsole, level);
348+
this.sinon.stub(originalConsoleMethods, level);
344349
logDebug(level, message, {}, 'foo');
345350
});
351+
352+
it('should be unaffected by monkeypatches to the console built-in', function() {
353+
Raven.debug = true;
354+
this.sinon.stub(console, level).throws("can't touch this");
355+
this.sinon.stub(originalConsoleMethods, level);
356+
logDebug(level, message);
357+
assert.isTrue(originalConsoleMethods[level].calledOnce);
358+
assert.isFalse(console[level].called);
359+
console[level].restore();
360+
});
346361
});
347362

348363
describe('setAuthQueryString', function() {

0 commit comments

Comments
 (0)