Skip to content

Commit 675f74d

Browse files
committed
Improve stack reporting
- Handle reports from console.log - Expose debug as TraceKit.debug - Add soft failure for Error.stack - Add default report (no stacktrace) Fixes GH-358
1 parent b558746 commit 675f74d

File tree

2 files changed

+37
-18
lines changed

2 files changed

+37
-18
lines changed

test/raven.test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,22 @@ describe('TraceKit', function(){
7979
assert.deepEqual(stack.name, 'Error');
8080
assert.deepEqual(stack.message, 'test');
8181
});
82+
83+
it('should handle a native error object stack from Chrome', function() {
84+
var stackStr = "" +
85+
"Error: foo\n" +
86+
" at <anonymous>:2:11\n" +
87+
" at Object.InjectedScript._evaluateOn (<anonymous>:904:140)\n" +
88+
" at Object.InjectedScript._evaluateAndWrap (<anonymous>:837:34)\n" +
89+
" at Object.InjectedScript.evaluate (<anonymous>:693:21)";
90+
var mockErr = {
91+
name: 'Error',
92+
message: 'foo',
93+
stack: stackStr
94+
};
95+
var trace = TraceKit.computeStackTrace(mockErr);
96+
assert.deepEqual(trace.stack[0].url, '<anonymous>');
97+
});
8298
});
8399

84100
describe('error notifications', function(){

vendor/TraceKit/tracekit.js

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ var TraceKit = {
77
remoteFetching: false,
88
collectWindowErrors: true,
99
// 3 lines before, the offending line, 3 lines after
10-
linesOfContext: 7
10+
linesOfContext: 7,
11+
debug: false
1112
};
1213

1314
// global reference to slice
@@ -305,8 +306,7 @@ TraceKit.report = (function reportModuleWrapper() {
305306
*
306307
*/
307308
TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
308-
var debug = false,
309-
sourceCache = {};
309+
var sourceCache = {};
310310

311311
/**
312312
* Attempts to retrieve source code via XMLHttpRequest, which is used
@@ -615,11 +615,9 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
615615
* @return {?Object.<string, *>} Stack trace information.
616616
*/
617617
function computeStackTraceFromStackProp(ex) {
618-
if (!ex.stack) {
619-
return null;
620-
}
618+
if (isUndefined(ex.stack) || !ex.stack) return;
621619

622-
var chrome = /^\s*at (.*?) ?\(?((?:file|https?|chrome-extension):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
620+
var chrome = /^\s*at (.*?) ?\(?((?:(?:file|https?|chrome-extension):.*?)|<anonymous>):(\d+)(?::(\d+))?\)?\s*$/i,
623621
gecko = /^\s*(.*?)(?:\((.*?)\))?@((?:file|https?|chrome).*?):(\d+)(?::(\d+))?\s*$/i,
624622
winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
625623
lines = ex.stack.split('\n'),
@@ -645,12 +643,12 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
645643
'column': parts[4] ? +parts[4] : null
646644
};
647645
} else if ((parts = winjs.exec(lines[i]))) {
648-
element = {
649-
'url': parts[2],
650-
'func': parts[1] || UNKNOWN_FUNCTION,
651-
'line': +parts[3],
652-
'column': parts[4] ? +parts[4] : null
653-
};
646+
element = {
647+
'url': parts[2],
648+
'func': parts[1] || UNKNOWN_FUNCTION,
649+
'line': +parts[3],
650+
'column': parts[4] ? +parts[4] : null
651+
};
654652
} else {
655653
continue;
656654
}
@@ -698,6 +696,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
698696
// else to it because Opera is not very good at providing it
699697
// reliably in other circumstances.
700698
var stacktrace = ex.stacktrace;
699+
if (isUndefined(ex.stacktrace) || !ex.stacktrace) return;
701700

702701
var testRE = / line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i,
703702
lines = stacktrace.split('\n'),
@@ -1010,7 +1009,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
10101009
return stack;
10111010
}
10121011
} catch (e) {
1013-
if (debug) {
1012+
if (TraceKit.debug) {
10141013
throw e;
10151014
}
10161015
}
@@ -1021,7 +1020,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
10211020
return stack;
10221021
}
10231022
} catch (e) {
1024-
if (debug) {
1023+
if (TraceKit.debug) {
10251024
throw e;
10261025
}
10271026
}
@@ -1032,7 +1031,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
10321031
return stack;
10331032
}
10341033
} catch (e) {
1035-
if (debug) {
1034+
if (TraceKit.debug) {
10361035
throw e;
10371036
}
10381037
}
@@ -1043,12 +1042,16 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
10431042
return stack;
10441043
}
10451044
} catch (e) {
1046-
if (debug) {
1045+
if (TraceKit.debug) {
10471046
throw e;
10481047
}
10491048
}
10501049

1051-
return {};
1050+
return {
1051+
'name': ex.name,
1052+
'message': lines[0],
1053+
'url': document.location.href,
1054+
};
10521055
}
10531056

10541057
computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;

0 commit comments

Comments
 (0)