Update Raven.js

pull/385/merge
Thibaut Courouble 8 years ago
parent 993c0d85fc
commit 2cef32dfe8

@ -1,4 +1,4 @@
/*! Raven.js 3.13.1 (f55d281) | github.com/getsentry/raven-js */ /*! Raven.js 3.14.2 (5cf57e1) | github.com/getsentry/raven-js */
/* /*
* Includes TraceKit * Includes TraceKit
@ -115,6 +115,9 @@ function Raven() {
crossOrigin: 'anonymous', crossOrigin: 'anonymous',
collectWindowErrors: true, collectWindowErrors: true,
maxMessageLength: 0, maxMessageLength: 0,
// By default, truncates URL values to 250 chars
maxUrlLength: 250,
stackTraceLimit: 50, stackTraceLimit: 50,
autoBreadcrumbs: true, autoBreadcrumbs: true,
sampleRate: 1 sampleRate: 1
@ -152,7 +155,7 @@ Raven.prototype = {
// webpack (using a build step causes webpack #1617). Grunt verifies that // webpack (using a build step causes webpack #1617). Grunt verifies that
// this value matches package.json during build. // this value matches package.json during build.
// See: https://github.com/getsentry/raven-js/issues/465 // See: https://github.com/getsentry/raven-js/issues/465
VERSION: '3.13.1', VERSION: '3.14.2',
debug: false, debug: false,
@ -457,9 +460,10 @@ Raven.prototype = {
if (this._globalOptions.stacktrace || (options && options.stacktrace)) { if (this._globalOptions.stacktrace || (options && options.stacktrace)) {
var ex; var ex;
// create a stack trace from this point; just trim // Generate a "synthetic" stack trace from this point.
// off extra frames so they don't include this function call (or // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative
// earlier Raven.js library fn calls) // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,
// or if it catches a thrown object without a "stack" property.
try { try {
throw new Error(msg); throw new Error(msg);
} catch (ex1) { } catch (ex1) {
@ -473,6 +477,9 @@ Raven.prototype = {
// fingerprint on msg, not stack trace (legacy behavior, could be // fingerprint on msg, not stack trace (legacy behavior, could be
// revisited) // revisited)
fingerprint: msg, fingerprint: msg,
// since we know this is a synthetic trace, the top N-most frames
// MUST be from Raven.js, so mark them as in_app later by setting
// trimHeadFrames
trimHeadFrames: (options.trimHeadFrames || 0) + 1 trimHeadFrames: (options.trimHeadFrames || 0) + 1
}, options); }, options);
@ -1385,9 +1392,48 @@ Raven.prototype = {
exception.value = truncate(exception.value, max); exception.value = truncate(exception.value, max);
} }
var request = data.request;
if (request) {
if (request.url) {
request.url = truncate(request.url, this._globalOptions.maxUrlLength);
}
if (request.Referer) {
request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);
}
}
if (data.breadcrumbs && data.breadcrumbs.values)
this._trimBreadcrumbs(data.breadcrumbs);
return data; return data;
}, },
/**
* Truncate breadcrumb values (right now just URLs)
*/
_trimBreadcrumbs: function (breadcrumbs) {
// known breadcrumb properties with urls
// TODO: also consider arbitrary prop values that start with (https?)?://
var urlProps = ['to', 'from', 'url'],
urlProp,
crumb,
data;
for (var i = 0; i < breadcrumbs.values.length; ++i) {
crumb = breadcrumbs.values[i];
if (!crumb.hasOwnProperty('data') || !isObject(crumb.data))
continue;
data = crumb.data;
for (var j = 0; j < urlProps.length; ++j) {
urlProp = urlProps[j];
if (data.hasOwnProperty(urlProp)) {
data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);
}
}
}
},
_getHttpData: function() { _getHttpData: function() {
if (!this._hasNavigator && !this._hasDocument) return; if (!this._hasNavigator && !this._hasDocument) return;
var httpData = {}; var httpData = {};
@ -2083,20 +2129,22 @@ function isObject(what) {
return typeof what === 'object' && what !== null; return typeof what === 'object' && what !== null;
} }
// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L560 // Yanked from https://git.io/vS8DV re-used under CC0
// with some tiny modifications // with some tiny modifications
function isError(what) { function isError(value) {
var toString = {}.toString.call(what); switch ({}.toString.call(value)) {
return isObject(what) && case '[object Error]': return true;
toString === '[object Error]' || case '[object Exception]': return true;
toString === '[object Exception]' || // Firefox NS_ERROR_FAILURE Exceptions case '[object DOMException]': return true;
what instanceof Error; default: return value instanceof Error;
}
} }
module.exports = { module.exports = {
isObject: isObject, isObject: isObject,
isError: isError isError: isError
}; };
},{}],6:[function(_dereq_,module,exports){ },{}],6:[function(_dereq_,module,exports){
(function (global){ (function (global){
'use strict'; 'use strict';
@ -2424,27 +2472,6 @@ TraceKit.report = (function reportModuleWrapper() {
* *
*/ */
TraceKit.computeStackTrace = (function computeStackTraceWrapper() { TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
/**
* Escapes special characters, except for whitespace, in a string to be
* used inside a regular expression as a string literal.
* @param {string} text The string.
* @return {string} The escaped string literal.
*/
function escapeRegExp(text) {
return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&');
}
/**
* Escapes special characters in a string to be used inside a regular
* expression as a string literal. Also ensures that HTML entities will
* be matched the same as their literal friends.
* @param {string} body The string.
* @return {string} The escaped string.
*/
function escapeCodeAsRegExpForMatchingInsideHTML(body) {
return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('"', '(?:"|&quot;)').replace(/\s+/g, '\\s+');
}
// Contents of Exception in various browsers. // Contents of Exception in various browsers.
// //
// SAFARI: // SAFARI:
@ -2491,18 +2518,31 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
function computeStackTraceFromStackProp(ex) { function computeStackTraceFromStackProp(ex) {
if (typeof ex.stack === 'undefined' || !ex.stack) return; if (typeof ex.stack === 'undefined' || !ex.stack) return;
var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,
gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|resource|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i, gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i,
winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
// Used to additionally parse URL/line/column from eval frames
geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i,
chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/,
lines = ex.stack.split('\n'), lines = ex.stack.split('\n'),
stack = [], stack = [],
submatch,
parts, parts,
element, element,
reference = /^(.*) is undefined$/.exec(ex.message); reference = /^(.*) is undefined$/.exec(ex.message);
for (var i = 0, j = lines.length; i < j; ++i) { for (var i = 0, j = lines.length; i < j; ++i) {
if ((parts = chrome.exec(lines[i]))) { if ((parts = chrome.exec(lines[i]))) {
var isNative = parts[2] && parts[2].indexOf('native') !== -1; var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
if (isEval && (submatch = chromeEval.exec(parts[2]))) {
// throw out eval line/column and use top-most line/column number
parts[2] = submatch[1]; // url
parts[3] = submatch[2]; // line
parts[4] = submatch[3]; // column
}
element = { element = {
'url': !isNative ? parts[2] : null, 'url': !isNative ? parts[2] : null,
'func': parts[1] || UNKNOWN_FUNCTION, 'func': parts[1] || UNKNOWN_FUNCTION,
@ -2519,6 +2559,19 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
'column': parts[4] ? +parts[4] : null 'column': parts[4] ? +parts[4] : null
}; };
} else if ((parts = gecko.exec(lines[i]))) { } else if ((parts = gecko.exec(lines[i]))) {
var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
if (isEval && (submatch = geckoEval.exec(parts[3]))) {
// throw out eval line/column and use top-most line number
parts[3] = submatch[1];
parts[4] = submatch[2];
parts[5] = null; // no column when eval
} else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {
// FireFox uses this awesome columnNumber property for its top frame
// Also note, Firefox's column number is 0-based and everything else expects 1-based,
// so adding 1
// NOTE: this hack doesn't work if top-most frame is eval
stack[0].column = ex.columnNumber + 1;
}
element = { element = {
'url': parts[3], 'url': parts[3],
'func': parts[1] || UNKNOWN_FUNCTION, 'func': parts[1] || UNKNOWN_FUNCTION,
@ -2541,13 +2594,6 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
return null; return null;
} }
if (!stack[0].column && typeof ex.columnNumber !== 'undefined') {
// FireFox uses this awesome columnNumber property for its top frame
// Also note, Firefox's column number is 0-based and everything else expects 1-based,
// so adding 1
stack[0].column = ex.columnNumber + 1;
}
return { return {
'name': ex.name, 'name': ex.name,
'message': ex.message, 'message': ex.message,

Loading…
Cancel
Save