aboutsummaryrefslogtreecommitdiffstats
path: root/demo/dist/demo.js
diff options
context:
space:
mode:
authorSam Potts <sam@potts.es>2019-02-23 13:14:01 +1100
committerSam Potts <sam@potts.es>2019-02-23 13:14:01 +1100
commit215fc3677af16e08ffa351b20a4b5b15719df307 (patch)
tree3c718ee3fd0cf933008e1d2a63d2ab7a739bf95f /demo/dist/demo.js
parent4d3b6b882e5a66a06467d0087a5a2bdf8a03d1af (diff)
downloadplyr-215fc3677af16e08ffa351b20a4b5b15719df307.tar.lz
plyr-215fc3677af16e08ffa351b20a4b5b15719df307.tar.xz
plyr-215fc3677af16e08ffa351b20a4b5b15719df307.zip
v3.5.1
Diffstat (limited to 'demo/dist/demo.js')
-rw-r--r--demo/dist/demo.js3337
1 files changed, 1561 insertions, 1776 deletions
diff --git a/demo/dist/demo.js b/demo/dist/demo.js
index bbc9e970..95920476 100644
--- a/demo/dist/demo.js
+++ b/demo/dist/demo.js
@@ -7,107 +7,211 @@ typeof navigator === "object" && (function () {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
- var stringify_1 = createCommonjsModule(function (module, exports) {
- /*
- json-stringify-safe
- Like JSON.stringify, but doesn't throw on circular references.
+ function _typeof(obj) {
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
- Originally forked from https://github.com/isaacs/json-stringify-safe
- version 5.0.1 on 3/8/2017 and modified to handle Errors serialization
- and IE8 compatibility. Tests for this are in test/vendor.
+ return _typeof(obj);
+ }
- ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE
- */
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
- exports = module.exports = stringify;
- exports.getSerialize = serializer;
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
- function indexOf(haystack, needle) {
- for (var i = 0; i < haystack.length; ++i) {
- if (haystack[i] === needle) return i;
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
}
- return -1;
+
+ return obj;
}
- function stringify(obj, replacer, spaces, cycleReplacer) {
- return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);
+ function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
}
- // https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106
- function stringifyError(value) {
- var err = {
- // These properties are implemented as magical getters and don't show up in for in
- stack: value.stack,
- message: value.message,
- name: value.name
- };
+ function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
+ }
+
+ function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+
+ return arr2;
+ }
+ }
+
+ function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+ }
+
+ function _iterableToArray(iter) {
+ if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
+ }
+
+ function _iterableToArrayLimit(arr, i) {
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
- for (var i in value) {
- if (Object.prototype.hasOwnProperty.call(value, i)) {
- err[i] = value[i];
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
}
}
- return err;
+ return _arr;
}
- function serializer(replacer, cycleReplacer) {
- var stack = [];
- var keys = [];
+ function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance");
+ }
- if (cycleReplacer == null) {
- cycleReplacer = function(key, value) {
- if (stack[0] === value) {
- return '[Circular ~]';
- }
- return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';
- };
+ function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ }
+
+ var stringify_1 = createCommonjsModule(function (module, exports) {
+ /*
+ json-stringify-safe
+ Like JSON.stringify, but doesn't throw on circular references.
+
+ Originally forked from https://github.com/isaacs/json-stringify-safe
+ version 5.0.1 on 3/8/2017 and modified to handle Errors serialization
+ and IE8 compatibility. Tests for this are in test/vendor.
+
+ ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE
+ */
+ exports = module.exports = stringify;
+ exports.getSerialize = serializer;
+
+ function indexOf(haystack, needle) {
+ for (var i = 0; i < haystack.length; ++i) {
+ if (haystack[i] === needle) return i;
+ }
+
+ return -1;
}
- return function(key, value) {
- if (stack.length > 0) {
- var thisPos = indexOf(stack, this);
- ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
- ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
+ function stringify(obj, replacer, spaces, cycleReplacer) {
+ return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);
+ } // https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106
- if (~indexOf(stack, value)) {
- value = cycleReplacer.call(this, key, value);
+
+ function stringifyError(value) {
+ var err = {
+ // These properties are implemented as magical getters and don't show up in for in
+ stack: value.stack,
+ message: value.message,
+ name: value.name
+ };
+
+ for (var i in value) {
+ if (Object.prototype.hasOwnProperty.call(value, i)) {
+ err[i] = value[i];
}
- } else {
- stack.push(value);
}
- return replacer == null
- ? value instanceof Error ? stringifyError(value) : value
- : replacer.call(this, key, value);
- };
- }
+ return err;
+ }
+
+ function serializer(replacer, cycleReplacer) {
+ var stack = [];
+ var keys = [];
+
+ if (cycleReplacer == null) {
+ cycleReplacer = function cycleReplacer(key, value) {
+ if (stack[0] === value) {
+ return '[Circular ~]';
+ }
+
+ return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';
+ };
+ }
+
+ return function (key, value) {
+ if (stack.length > 0) {
+ var thisPos = indexOf(stack, this);
+ ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
+ ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
+
+ if (~indexOf(stack, value)) {
+ value = cycleReplacer.call(this, key, value);
+ }
+ } else {
+ stack.push(value);
+ }
+
+ return replacer == null ? value instanceof Error ? stringifyError(value) : value : replacer.call(this, key, value);
+ };
+ }
});
var stringify_2 = stringify_1.getSerialize;
- var _window =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined'
- ? commonjsGlobal
- : typeof self !== 'undefined'
- ? self
- : {};
+ var _window = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
function isObject(what) {
- return typeof what === 'object' && what !== null;
- }
-
- // Yanked from https://git.io/vS8DV re-used under CC0
+ return _typeof(what) === 'object' && what !== null;
+ } // Yanked from https://git.io/vS8DV re-used under CC0
// with some tiny modifications
+
+
function isError(value) {
switch (Object.prototype.toString.call(value)) {
case '[object Error]':
return true;
+
case '[object Exception]':
return true;
+
case '[object DOMException]':
return true;
+
default:
return value instanceof Error;
}
@@ -153,12 +257,14 @@ typeof navigator === "object" && (function () {
return false;
}
}
+
return true;
}
function supportsErrorEvent() {
try {
new ErrorEvent(''); // eslint-disable-line no-new
+
return true;
} catch (e) {
return false;
@@ -168,6 +274,7 @@ typeof navigator === "object" && (function () {
function supportsDOMError() {
try {
new DOMError(''); // eslint-disable-line no-new
+
return true;
} catch (e) {
return false;
@@ -177,6 +284,7 @@ typeof navigator === "object" && (function () {
function supportsDOMException() {
try {
new DOMException(''); // eslint-disable-line no-new
+
return true;
} catch (e) {
return false;
@@ -188,18 +296,21 @@ typeof navigator === "object" && (function () {
try {
new Headers(); // eslint-disable-line no-new
+
new Request(''); // eslint-disable-line no-new
+
new Response(); // eslint-disable-line no-new
+
return true;
} catch (e) {
return false;
}
- }
-
- // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
+ } // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
// https://caniuse.com/#feat=referrer-policy
// It doesn't. And it throw exception instead of ignoring this parameter...
// REF: https://github.com/getsentry/raven-js/issues/1233
+
+
function supportsReferrerPolicy() {
if (!supportsFetch()) return false;
@@ -221,9 +332,11 @@ typeof navigator === "object" && (function () {
function wrappedCallback(callback) {
function dataCallback(data, original) {
var normalizedData = callback(data) || data;
+
if (original) {
return original(normalizedData) || normalizedData;
}
+
return normalizedData;
}
@@ -241,6 +354,7 @@ typeof navigator === "object" && (function () {
}
} else {
j = obj.length;
+
if (j) {
for (i = 0; i < j; i++) {
callback.call(null, i, obj[i]);
@@ -253,12 +367,12 @@ typeof navigator === "object" && (function () {
if (!obj2) {
return obj1;
}
- each(obj2, function(key, value) {
+
+ each(obj2, function (key, value) {
obj1[key] = value;
});
return obj1;
}
-
/**
* This function is only used for react-native.
* react-native freezes object that have already been sent over the
@@ -267,10 +381,13 @@ typeof navigator === "object" && (function () {
* supported because it's not relevant for other "platforms". See related issue:
* https://github.com/getsentry/react-native-sentry/issues/57
*/
+
+
function objectFrozen(obj) {
if (!Object.isFrozen) {
return false;
}
+
return Object.isFrozen(obj);
}
@@ -278,12 +395,13 @@ typeof navigator === "object" && (function () {
if (typeof max !== 'number') {
throw new Error('2nd argument to `truncate` function should be a number');
}
+
if (typeof str !== 'string' || max === 0) {
return str;
}
- return str.length <= max ? str : str.substr(0, max) + '\u2026';
- }
+ return str.length <= max ? str : str.substr(0, max) + "\u2026";
+ }
/**
* hasKey, a better form of hasOwnProperty
* Example: hasKey(MainHostObject, property) === true/false
@@ -291,6 +409,8 @@ typeof navigator === "object" && (function () {
* @param {Object} host object to check property
* @param {string} key to check
*/
+
+
function hasKey(object, key) {
return Object.prototype.hasOwnProperty.call(object, key);
}
@@ -299,12 +419,13 @@ typeof navigator === "object" && (function () {
// Combine an array of regular expressions and strings into one large regexp
// Be mad.
var sources = [],
- i = 0,
- len = patterns.length,
- pattern;
+ i = 0,
+ len = patterns.length,
+ pattern;
for (; i < len; i++) {
pattern = patterns[i];
+
if (isString(pattern)) {
// If it's a string, we need to escape it
// Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
@@ -312,28 +433,28 @@ typeof navigator === "object" && (function () {
} else if (pattern && pattern.source) {
// If it's a regexp already, we want to extract the source
sources.push(pattern.source);
- }
- // Intentionally skip other cases
+ } // Intentionally skip other cases
+
}
+
return new RegExp(sources.join('|'), 'i');
}
function urlencode(o) {
var pairs = [];
- each(o, function(key, value) {
+ each(o, function (key, value) {
pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
});
return pairs.join('&');
- }
-
- // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
+ } // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
// intentionally using regex and not <a/> href parsing trick because React Native and other
// environments where DOM might not be available
+
+
function parseUrl(url) {
if (typeof url !== 'string') return {};
- var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
+ var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); // coerce to undefined values to empty string so we don't get 'undefined'
- // coerce to undefined values to empty string so we don't get 'undefined'
var query = match[6] || '';
var fragment = match[8] || '';
return {
@@ -341,8 +462,10 @@ typeof navigator === "object" && (function () {
host: match[4],
path: match[5],
relative: match[5] + query + fragment // everything minus origin
+
};
}
+
function uuid4() {
var crypto = _window.crypto || _window.msCrypto;
@@ -350,41 +473,32 @@ typeof navigator === "object" && (function () {
// Use window.crypto API if available
// eslint-disable-next-line no-undef
var arr = new Uint16Array(8);
- crypto.getRandomValues(arr);
+ crypto.getRandomValues(arr); // set 4 in byte 7
+
+ arr[3] = arr[3] & 0xfff | 0x4000; // set 2 most significant bits of byte 9 to '10'
- // set 4 in byte 7
- arr[3] = (arr[3] & 0xfff) | 0x4000;
- // set 2 most significant bits of byte 9 to '10'
- arr[4] = (arr[4] & 0x3fff) | 0x8000;
+ arr[4] = arr[4] & 0x3fff | 0x8000;
- var pad = function(num) {
+ var pad = function pad(num) {
var v = num.toString(16);
+
while (v.length < 4) {
v = '0' + v;
}
+
return v;
};
- return (
- pad(arr[0]) +
- pad(arr[1]) +
- pad(arr[2]) +
- pad(arr[3]) +
- pad(arr[4]) +
- pad(arr[5]) +
- pad(arr[6]) +
- pad(arr[7])
- );
+ return pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]);
} else {
// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
- return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
- var r = (Math.random() * 16) | 0,
- v = c === 'x' ? r : (r & 0x3) | 0x8;
+ return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ var r = Math.random() * 16 | 0,
+ v = c === 'x' ? r : r & 0x3 | 0x8;
return v.toString(16);
});
}
}
-
/**
* Given a child DOM element, returns a query-selector statement describing that
* and its ancestors
@@ -392,142 +506,139 @@ typeof navigator === "object" && (function () {
* @param elem
* @returns {string}
*/
+
+
function htmlTreeAsString(elem) {
/* eslint no-extra-parens:0*/
var MAX_TRAVERSE_HEIGHT = 5,
- MAX_OUTPUT_LEN = 80,
- out = [],
- height = 0,
- len = 0,
- separator = ' > ',
- sepLength = separator.length,
- nextStr;
+ MAX_OUTPUT_LEN = 80,
+ out = [],
+ height = 0,
+ len = 0,
+ separator = ' > ',
+ sepLength = separator.length,
+ nextStr;
while (elem && height++ < MAX_TRAVERSE_HEIGHT) {
- nextStr = htmlElementAsString(elem);
- // bail out if
+ nextStr = htmlElementAsString(elem); // bail out if
// - nextStr is the 'html' element
// - the length of the string that would be created exceeds MAX_OUTPUT_LEN
// (ignore this limit if we are on the first iteration)
- if (
- nextStr === 'html' ||
- (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)
- ) {
+
+ if (nextStr === 'html' || height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) {
break;
}
out.push(nextStr);
-
len += nextStr.length;
elem = elem.parentNode;
}
return out.reverse().join(separator);
}
-
/**
* Returns a simple, query-selector representation of a DOM element
* e.g. [HTMLElement] => input#foo.btn[name=baz]
* @param HTMLElement
* @returns {string}
*/
+
+
function htmlElementAsString(elem) {
var out = [],
- className,
- classes,
- key,
- attr,
- i;
+ className,
+ classes,
+ key,
+ attr,
+ i;
if (!elem || !elem.tagName) {
return '';
}
out.push(elem.tagName.toLowerCase());
+
if (elem.id) {
out.push('#' + elem.id);
}
className = elem.className;
+
if (className && isString(className)) {
classes = className.split(/\s+/);
+
for (i = 0; i < classes.length; i++) {
out.push('.' + classes[i]);
}
}
+
var attrWhitelist = ['type', 'name', 'title', 'alt'];
+
for (i = 0; i < attrWhitelist.length; i++) {
key = attrWhitelist[i];
attr = elem.getAttribute(key);
+
if (attr) {
out.push('[' + key + '="' + attr + '"]');
}
}
+
return out.join('');
}
-
/**
* Returns true if either a OR b is truthy, but not both
*/
+
+
function isOnlyOneTruthy(a, b) {
return !!(!!a ^ !!b);
}
-
/**
* Returns true if both parameters are undefined
*/
+
+
function isBothUndefined(a, b) {
return isUndefined(a) && isUndefined(b);
}
-
/**
* Returns true if the two input exception interfaces have the same content
*/
+
+
function isSameException(ex1, ex2) {
if (isOnlyOneTruthy(ex1, ex2)) return false;
-
ex1 = ex1.values[0];
ex2 = ex2.values[0];
+ if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; // in case both stacktraces are undefined, we can't decide so default to false
- if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;
-
- // in case both stacktraces are undefined, we can't decide so default to false
if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;
-
return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);
}
-
/**
* Returns true if the two input stack trace interfaces have the same content
*/
+
+
function isSameStacktrace(stack1, stack2) {
if (isOnlyOneTruthy(stack1, stack2)) return false;
-
var frames1 = stack1.frames;
- var frames2 = stack2.frames;
+ var frames2 = stack2.frames; // Exit early if stacktrace is malformed
- // Exit early if stacktrace is malformed
- if (frames1 === undefined || frames2 === undefined) return false;
+ if (frames1 === undefined || frames2 === undefined) return false; // Exit early if frame count differs
- // Exit early if frame count differs
- if (frames1.length !== frames2.length) return false;
+ if (frames1.length !== frames2.length) return false; // Iterate through every frame; bail out if anything differs
- // Iterate through every frame; bail out if anything differs
var a, b;
+
for (var i = 0; i < frames1.length; i++) {
a = frames1[i];
b = frames2[i];
- if (
- a.filename !== b.filename ||
- a.lineno !== b.lineno ||
- a.colno !== b.colno ||
- a['function'] !== b['function']
- )
- return false;
+ if (a.filename !== b.filename || a.lineno !== b.lineno || a.colno !== b.colno || a['function'] !== b['function']) return false;
}
+
return true;
}
-
/**
* Polyfill a method
* @param obj object e.g. `document`
@@ -535,26 +646,29 @@ typeof navigator === "object" && (function () {
* @param replacement replacement function
* @param track {optional} record instrumentation to an array
*/
+
+
function fill(obj, name, replacement, track) {
if (obj == null) return;
var orig = obj[name];
obj[name] = replacement(orig);
obj[name].__raven__ = true;
obj[name].__orig__ = orig;
+
if (track) {
track.push([obj, name, orig]);
}
}
-
/**
* Join values in array
* @param input array of values to be joined together
* @param delimiter string to be placed in-between values
* @returns {string}
*/
+
+
function safeJoin(input, delimiter) {
if (!isArray(input)) return '';
-
var output = [];
for (var i = 0; i < input.length; i++) {
@@ -566,11 +680,11 @@ typeof navigator === "object" && (function () {
}
return output.join(delimiter);
- }
+ } // Default Node.js REPL depth
+
+
+ var MAX_SERIALIZE_EXCEPTION_DEPTH = 3; // 50kB, as 100kB is max payload size, so half sounds reasonable
- // Default Node.js REPL depth
- var MAX_SERIALIZE_EXCEPTION_DEPTH = 3;
- // 50kB, as 100kB is max payload size, so half sounds reasonable
var MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;
var MAX_SERIALIZE_KEYS_LENGTH = 40;
@@ -586,22 +700,15 @@ typeof navigator === "object" && (function () {
if (typeof value === 'string') {
var maxLength = 40;
return truncate(value, maxLength);
- } else if (
- typeof value === 'number' ||
- typeof value === 'boolean' ||
- typeof value === 'undefined'
- ) {
+ } else if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'undefined') {
return value;
}
- var type = Object.prototype.toString.call(value);
+ var type = Object.prototype.toString.call(value); // Node.js REPL notation
- // Node.js REPL notation
if (type === '[object Object]') return '[Object]';
if (type === '[object Array]') return '[Array]';
- if (type === '[object Function]')
- return value.name ? '[Function: ' + value.name + ']' : '[Function]';
-
+ if (type === '[object Function]') return value.name ? '[Function: ' + value.name + ']' : '[Function]';
return value;
}
@@ -609,12 +716,12 @@ typeof navigator === "object" && (function () {
if (depth === 0) return serializeValue(value);
if (isPlainObject(value)) {
- return Object.keys(value).reduce(function(acc, key) {
+ return Object.keys(value).reduce(function (acc, key) {
acc[key] = serializeObject(value[key], depth - 1);
return acc;
}, {});
} else if (Array.isArray(value)) {
- return value.map(function(val) {
+ return value.map(function (val) {
return serializeObject(val, depth - 1);
});
}
@@ -624,10 +731,8 @@ typeof navigator === "object" && (function () {
function serializeException(ex, depth, maxSize) {
if (!isPlainObject(ex)) return ex;
-
depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;
maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;
-
var serialized = serializeObject(ex, depth);
if (jsonSize(stringify_1(serialized)) > maxSize) {
@@ -640,12 +745,10 @@ typeof navigator === "object" && (function () {
function serializeKeysForMessage(keys, maxLength) {
if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();
if (!Array.isArray(keys)) return '';
-
- keys = keys.filter(function(key) {
+ keys = keys.filter(function (key) {
return typeof key === 'string';
});
if (keys.length === 0) return '[object has no keys]';
-
maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;
if (keys[0].length >= maxLength) return keys[0];
@@ -653,16 +756,14 @@ typeof navigator === "object" && (function () {
var serialized = keys.slice(0, usedKeys).join(', ');
if (serialized.length > maxLength) continue;
if (usedKeys === keys.length) return serialized;
- return serialized + '\u2026';
+ return serialized + "\u2026";
}
return '';
}
function sanitize(input, sanitizeKeys) {
- if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))
- return input;
-
+ if (!isArray(sanitizeKeys) || isArray(sanitizeKeys) && sanitizeKeys.length === 0) return input;
var sanitizeRegExp = joinRegExp(sanitizeKeys);
var sanitizeMask = '********';
var safeInput;
@@ -675,18 +776,19 @@ typeof navigator === "object" && (function () {
function sanitizeWorker(workerInput) {
if (isArray(workerInput)) {
- return workerInput.map(function(val) {
+ return workerInput.map(function (val) {
return sanitizeWorker(val);
});
}
if (isPlainObject(workerInput)) {
- return Object.keys(workerInput).reduce(function(acc, k) {
+ return Object.keys(workerInput).reduce(function (acc, k) {
if (sanitizeRegExp.test(k)) {
acc[k] = sanitizeMask;
} else {
acc[k] = sanitizeWorker(workerInput[k]);
}
+
return acc;
}, {});
}
@@ -749,19 +851,14 @@ typeof navigator === "object" && (function () {
var TraceKit = {
collectWindowErrors: true,
debug: false
- };
+ }; // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
+
+ var _window$1 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; // global reference to slice
- // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
- var _window$1 =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
- // global reference to slice
var _slice = [].slice;
- var UNKNOWN_FUNCTION = '?';
+ var UNKNOWN_FUNCTION = '?'; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types
var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;
function getLocationHref() {
@@ -770,21 +867,14 @@ typeof navigator === "object" && (function () {
}
function getLocationOrigin() {
- if (typeof document === 'undefined' || document.location == null) return '';
+ if (typeof document === 'undefined' || document.location == null) return ''; // Oh dear IE10...
- // Oh dear IE10...
if (!document.location.origin) {
- return (
- document.location.protocol +
- '//' +
- document.location.hostname +
- (document.location.port ? ':' + document.location.port : '')
- );
+ return document.location.protocol + '//' + document.location.hostname + (document.location.port ? ':' + document.location.port : '');
}
return document.location.origin;
}
-
/**
* TraceKit.report: cross-browser processing of unhandled exceptions
*
@@ -824,25 +914,28 @@ typeof navigator === "object" && (function () {
* Handlers receive a stackInfo object as described in the
* TraceKit.computeStackTrace docs.
*/
- TraceKit.report = (function reportModuleWrapper() {
- var handlers = [],
- lastArgs = null,
- lastException = null,
- lastExceptionStack = null;
+
+ TraceKit.report = function reportModuleWrapper() {
+ var handlers = [],
+ lastArgs = null,
+ lastException = null,
+ lastExceptionStack = null;
/**
* Add a crash handler.
* @param {Function} handler
*/
+
function subscribe(handler) {
installGlobalHandler();
handlers.push(handler);
}
-
/**
* Remove a crash handler.
* @param {Function} handler
*/
+
+
function unsubscribe(handler) {
for (var i = handlers.length - 1; i >= 0; --i) {
if (handlers[i] === handler) {
@@ -850,24 +943,28 @@ typeof navigator === "object" && (function () {
}
}
}
-
/**
* Remove all crash handlers.
*/
+
+
function unsubscribeAll() {
uninstallGlobalHandler();
handlers = [];
}
-
/**
* Dispatch stack information to all handlers.
* @param {Object.<string, *>} stack
*/
+
+
function notifyHandlers(stack, isWindowError) {
var exception = null;
+
if (isWindowError && !TraceKit.collectWindowErrors) {
return;
}
+
for (var i in handlers) {
if (handlers.hasOwnProperty(i)) {
try {
@@ -884,7 +981,6 @@ typeof navigator === "object" && (function () {
}
var _oldOnerrorHandler, _onErrorHandlerInstalled;
-
/**
* Ensures all global unhandled exceptions are recorded.
* Supported by Gecko and IE.
@@ -896,24 +992,20 @@ typeof navigator === "object" && (function () {
* occurred.
* @param {?Error} ex The actual Error object.
*/
+
+
function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {
- var stack = null;
- // If 'ex' is ErrorEvent, get real Error from inside
- var exception = utils.isErrorEvent(ex) ? ex.error : ex;
- // If 'msg' is ErrorEvent, get real message from inside
+ var stack = null; // If 'ex' is ErrorEvent, get real Error from inside
+
+ var exception = utils.isErrorEvent(ex) ? ex.error : ex; // If 'msg' is ErrorEvent, get real message from inside
+
var message = utils.isErrorEvent(msg) ? msg.message : msg;
if (lastExceptionStack) {
- TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(
- lastExceptionStack,
- url,
- lineNo,
- message
- );
+ TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);
processLastException();
} else if (exception && utils.isError(exception)) {
// non-string `exception` arg; attempt to extract stack trace
-
// New chrome and blink send along a real error object
// Let's just report that like a normal error.
// See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror
@@ -925,12 +1017,12 @@ typeof navigator === "object" && (function () {
line: lineNo,
column: colNo
};
-
var name = undefined;
var groups;
if ({}.toString.call(message) === '[object String]') {
var groups = message.match(ERROR_TYPES_RE);
+
if (groups) {
name = groups[1];
message = groups[2];
@@ -938,7 +1030,6 @@ typeof navigator === "object" && (function () {
}
location.func = UNKNOWN_FUNCTION;
-
stack = {
name: name,
message: message,
@@ -959,6 +1050,7 @@ typeof navigator === "object" && (function () {
if (_onErrorHandlerInstalled) {
return;
}
+
_oldOnerrorHandler = _window$1.onerror;
_window$1.onerror = traceKitWindowOnError;
_onErrorHandlerInstalled = true;
@@ -968,6 +1060,7 @@ typeof navigator === "object" && (function () {
if (!_onErrorHandlerInstalled) {
return;
}
+
_window$1.onerror = _oldOnerrorHandler;
_onErrorHandlerInstalled = false;
_oldOnerrorHandler = undefined;
@@ -975,13 +1068,12 @@ typeof navigator === "object" && (function () {
function processLastException() {
var _lastExceptionStack = lastExceptionStack,
- _lastArgs = lastArgs;
+ _lastArgs = lastArgs;
lastArgs = null;
lastExceptionStack = null;
lastException = null;
notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));
}
-
/**
* Reports an unhandled Error to TraceKit.
* @param {Error} ex
@@ -989,8 +1081,11 @@ typeof navigator === "object" && (function () {
* Only used for window.onerror to not cause an infinite loop of
* rethrowing.
*/
+
+
function report(ex, rethrow) {
var args = _slice.call(arguments, 1);
+
if (lastExceptionStack) {
if (lastException === ex) {
return; // already caught by an inner catch block, ignore
@@ -1002,13 +1097,12 @@ typeof navigator === "object" && (function () {
var stack = TraceKit.computeStackTrace(ex);
lastExceptionStack = stack;
lastException = ex;
- lastArgs = args;
-
- // If the stack trace is incomplete, wait for 2 seconds for
+ lastArgs = args; // If the stack trace is incomplete, wait for 2 seconds for
// slow slow IE to see if onerror occurs or not before reporting
// this exception; otherwise, we will end up with an incomplete
// stack trace
- setTimeout(function() {
+
+ setTimeout(function () {
if (lastException === ex) {
processLastException();
}
@@ -1023,8 +1117,7 @@ typeof navigator === "object" && (function () {
report.unsubscribe = unsubscribe;
report.uninstall = unsubscribeAll;
return report;
- })();
-
+ }();
/**
* TraceKit.computeStackTrace: cross-browser stack traces in JavaScript
*
@@ -1076,7 +1169,9 @@ typeof navigator === "object" && (function () {
* inner function that actually caused the exception).
*
*/
- TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
+
+
+ TraceKit.computeStackTrace = function computeStackTraceWrapper() {
// Contents of Exception in various browsers.
//
// SAFARI:
@@ -1122,13 +1217,12 @@ typeof navigator === "object" && (function () {
*/
function computeStackTraceFromStackProp(ex) {
if (typeof ex.stack === 'undefined' || !ex.stack) return;
-
var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
- var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
- // NOTE: blob urls are now supposed to always have an origin, therefore it's format
+ var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; // NOTE: blob urls are now supposed to always have an origin, therefore it's format
// which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\/` as well
- var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
- // Used to additionally parse URL/line/column from eval frames
+
+ var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i; // Used to additionally parse URL/line/column from eval frames
+
var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
var lines = ex.stack.split('\n');
@@ -1139,15 +1233,20 @@ typeof navigator === "object" && (function () {
var reference = /^(.*) is undefined$/.exec(ex.message);
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') === 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 = {
url: !isNative ? parts[2] : null,
func: parts[1] || UNKNOWN_FUNCTION,
@@ -1155,7 +1254,7 @@ typeof navigator === "object" && (function () {
line: parts[3] ? +parts[3] : null,
column: parts[4] ? +parts[4] : null
};
- } else if ((parts = winjs.exec(lines[i]))) {
+ } else if (parts = winjs.exec(lines[i])) {
element = {
url: parts[2],
func: parts[1] || UNKNOWN_FUNCTION,
@@ -1163,8 +1262,9 @@ typeof navigator === "object" && (function () {
line: +parts[3],
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];
@@ -1177,6 +1277,7 @@ typeof navigator === "object" && (function () {
// NOTE: this hack doesn't work if top-most frame is eval
stack[0].column = ex.columnNumber + 1;
}
+
element = {
url: parts[3],
func: parts[1] || UNKNOWN_FUNCTION,
@@ -1200,31 +1301,26 @@ typeof navigator === "object" && (function () {
// that much of an issue.
var xhr = new XMLHttpRequest();
xhr.open('GET', element.url, false);
- xhr.send(null);
+ xhr.send(null); // If we failed to download the source, skip this patch
- // If we failed to download the source, skip this patch
if (xhr.status === 200) {
- var source = xhr.responseText || '';
-
- // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.
+ var source = xhr.responseText || ''; // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.
// Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175
- source = source.slice(-300);
- // Now we dig out the source map URL
- var sourceMaps = source.match(/\/\/# sourceMappingURL=(.*)$/);
+ source = source.slice(-300); // Now we dig out the source map URL
- // If we don't find a source map comment or we find more than one, continue on to the next element.
- if (sourceMaps) {
- var sourceMapAddress = sourceMaps[1];
+ var sourceMaps = source.match(/\/\/# sourceMappingURL=(.*)$/); // If we don't find a source map comment or we find more than one, continue on to the next element.
- // Now we check to see if it's a relative URL.
+ if (sourceMaps) {
+ var sourceMapAddress = sourceMaps[1]; // Now we check to see if it's a relative URL.
// If it is, convert it to an absolute one.
+
if (sourceMapAddress.charAt(0) === '~') {
sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);
- }
-
- // Now we strip the '.map' off of the end of the URL and update the
+ } // Now we strip the '.map' off of the end of the URL and update the
// element so that Sentry can match the map to the blob.
+
+
element.url = sourceMapAddress.slice(0, -4);
}
}
@@ -1244,7 +1340,6 @@ typeof navigator === "object" && (function () {
stack: stack
};
}
-
/**
* Adds information about the first frame to incomplete stack traces.
* Safari and IE require this to get complete data on the first frame.
@@ -1258,6 +1353,8 @@ typeof navigator === "object" && (function () {
* @return {boolean} Whether or not the stack information was
* augmented.
*/
+
+
function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {
var initial = {
url: url,
@@ -1275,10 +1372,7 @@ typeof navigator === "object" && (function () {
if (stackInfo.stack[0].url === initial.url) {
if (stackInfo.stack[0].line === initial.line) {
return false; // already in stack trace
- } else if (
- !stackInfo.stack[0].line &&
- stackInfo.stack[0].func === initial.func
- ) {
+ } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {
stackInfo.stack[0].line = initial.line;
return false;
}
@@ -1294,7 +1388,6 @@ typeof navigator === "object" && (function () {
return false;
}
-
/**
* Computes stack trace information by walking the arguments.caller
* chain at the time the exception occurred. This will cause earlier
@@ -1304,19 +1397,17 @@ typeof navigator === "object" && (function () {
* @param {Error} ex
* @return {?Object.<string, *>} Stack trace information.
*/
+
+
function computeStackTraceByWalkingCallerChain(ex, depth) {
var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,
- stack = [],
- funcs = {},
- recursion = false,
- parts,
- item;
-
- for (
- var curr = computeStackTraceByWalkingCallerChain.caller;
- curr && !recursion;
- curr = curr.caller
- ) {
+ stack = [],
+ funcs = {},
+ recursion = false,
+ parts,
+ item;
+
+ for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {
if (curr === computeStackTrace || curr === TraceKit.report) {
// console.log('skipping internal function');
continue;
@@ -1331,7 +1422,7 @@ typeof navigator === "object" && (function () {
if (curr.name) {
item.func = curr.name;
- } else if ((parts = functionName.exec(curr.toString()))) {
+ } else if (parts = functionName.exec(curr.toString())) {
item.func = parts[1];
}
@@ -1362,26 +1453,23 @@ typeof navigator === "object" && (function () {
url: getLocationHref(),
stack: stack
};
- augmentStackTraceWithInitialElement(
- result,
- ex.sourceURL || ex.fileName,
- ex.line || ex.lineNumber,
- ex.message || ex.description
- );
+ augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);
return result;
}
-
/**
* Computes a stack trace for an exception.
* @param {Error} ex
* @param {(string|number)=} depth
*/
+
+
function computeStackTrace(ex, depth) {
var stack = null;
depth = depth == null ? 0 : +depth;
try {
stack = computeStackTraceFromStackProp(ex);
+
if (stack) {
return stack;
}
@@ -1393,6 +1481,7 @@ typeof navigator === "object" && (function () {
try {
stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);
+
if (stack) {
return stack;
}
@@ -1401,6 +1490,7 @@ typeof navigator === "object" && (function () {
throw e;
}
}
+
return {
name: ex.name,
message: ex.message,
@@ -1410,9 +1500,8 @@ typeof navigator === "object" && (function () {
computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;
computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;
-
return computeStackTrace;
- })();
+ }();
var tracekit = TraceKit;
@@ -1442,43 +1531,49 @@ typeof navigator === "object" && (function () {
function safeAdd(x, y) {
var lsw = (x & 0xffff) + (y & 0xffff);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
- return (msw << 16) | (lsw & 0xffff);
+ return msw << 16 | lsw & 0xffff;
}
-
/*
* Bitwise rotate a 32-bit number to the left.
*/
+
+
function bitRotateLeft(num, cnt) {
- return (num << cnt) | (num >>> (32 - cnt));
+ return num << cnt | num >>> 32 - cnt;
}
-
/*
* These functions implement the four basic operations the algorithm uses.
*/
+
+
function md5cmn(q, a, b, x, s, t) {
return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}
+
function md5ff(a, b, c, d, x, s, t) {
- return md5cmn((b & c) | (~b & d), a, b, x, s, t);
+ return md5cmn(b & c | ~b & d, a, b, x, s, t);
}
+
function md5gg(a, b, c, d, x, s, t) {
- return md5cmn((b & d) | (c & ~d), a, b, x, s, t);
+ return md5cmn(b & d | c & ~d, a, b, x, s, t);
}
+
function md5hh(a, b, c, d, x, s, t) {
return md5cmn(b ^ c ^ d, a, b, x, s, t);
}
+
function md5ii(a, b, c, d, x, s, t) {
return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}
-
/*
* Calculate the MD5 of an array of little-endian words, and a bit length.
*/
+
+
function binlMD5(x, len) {
/* append padding */
- x[len >> 5] |= 0x80 << (len % 32);
- x[(((len + 64) >>> 9) << 4) + 14] = len;
-
+ x[len >> 5] |= 0x80 << len % 32;
+ x[(len + 64 >>> 9 << 4) + 14] = len;
var i;
var olda;
var oldb;
@@ -1494,7 +1589,6 @@ typeof navigator === "object" && (function () {
oldb = b;
oldc = c;
oldd = d;
-
a = md5ff(a, b, c, d, x[i], 7, -680876936);
d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
@@ -1511,7 +1605,6 @@ typeof navigator === "object" && (function () {
d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
-
a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
@@ -1528,7 +1621,6 @@ typeof navigator === "object" && (function () {
d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
-
a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
@@ -1545,7 +1637,6 @@ typeof navigator === "object" && (function () {
d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
-
a = md5ii(a, b, c, d, x[i], 6, -198630844);
d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
@@ -1562,56 +1653,66 @@ typeof navigator === "object" && (function () {
d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
-
a = safeAdd(a, olda);
b = safeAdd(b, oldb);
c = safeAdd(c, oldc);
d = safeAdd(d, oldd);
}
+
return [a, b, c, d];
}
-
/*
* Convert an array of little-endian words to a string
*/
+
+
function binl2rstr(input) {
var i;
var output = '';
var length32 = input.length * 32;
+
for (i = 0; i < length32; i += 8) {
- output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);
+ output += String.fromCharCode(input[i >> 5] >>> i % 32 & 0xff);
}
+
return output;
}
-
/*
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*/
+
+
function rstr2binl(input) {
var i;
var output = [];
output[(input.length >> 2) - 1] = undefined;
+
for (i = 0; i < output.length; i += 1) {
output[i] = 0;
}
+
var length8 = input.length * 8;
+
for (i = 0; i < length8; i += 8) {
- output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);
+ output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32;
}
+
return output;
}
-
/*
* Calculate the MD5 of a raw string
*/
+
+
function rstrMD5(s) {
return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));
}
-
/*
* Calculate the HMAC-MD5, of a key and some data (raw strings)
*/
+
+
function rstrHMACMD5(key, data) {
var i;
var bkey = rstr2binl(key);
@@ -1619,51 +1720,62 @@ typeof navigator === "object" && (function () {
var opad = [];
var hash;
ipad[15] = opad[15] = undefined;
+
if (bkey.length > 16) {
bkey = binlMD5(bkey, key.length * 8);
}
+
for (i = 0; i < 16; i += 1) {
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5c5c5c5c;
}
+
hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));
}
-
/*
* Convert a raw string to a hex string
*/
+
+
function rstr2hex(input) {
var hexTab = '0123456789abcdef';
var output = '';
var x;
var i;
+
for (i = 0; i < input.length; i += 1) {
x = input.charCodeAt(i);
- output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
+ output += hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f);
}
+
return output;
}
-
/*
* Encode a string as utf-8
*/
+
+
function str2rstrUTF8(input) {
return unescape(encodeURIComponent(input));
}
-
/*
* Take string arguments and return either raw or hex encoded strings
*/
+
+
function rawMD5(s) {
return rstrMD5(str2rstrUTF8(s));
}
+
function hexMD5(s) {
return rstr2hex(rawMD5(s));
}
+
function rawHMACMD5(k, d) {
return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));
}
+
function hexHMACMD5(k, d) {
return rstr2hex(rawHMACMD5(k, d));
}
@@ -1673,11 +1785,14 @@ typeof navigator === "object" && (function () {
if (!raw) {
return hexMD5(string);
}
+
return rawMD5(string);
}
+
if (!raw) {
return hexHMACMD5(key, string);
}
+
return rawHMACMD5(key, string);
}
@@ -1687,12 +1802,12 @@ typeof navigator === "object" && (function () {
this.name = 'RavenConfigError';
this.message = message;
}
+
RavenConfigError.prototype = new Error();
RavenConfigError.prototype.constructor = RavenConfigError;
-
var configError = RavenConfigError;
- var wrapMethod = function(console, level, callback) {
+ var wrapMethod = function wrapMethod(console, level, callback) {
var originalConsoleLevel = console[level];
var originalConsole = console;
@@ -1702,25 +1817,29 @@ typeof navigator === "object" && (function () {
var sentryLevel = level === 'warn' ? 'warning' : level;
- console[level] = function() {
+ console[level] = function () {
var args = [].slice.call(arguments);
-
var msg = utils.safeJoin(args, ' ');
- var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};
+ var data = {
+ level: sentryLevel,
+ logger: 'console',
+ extra: {
+ arguments: args
+ }
+ };
if (level === 'assert') {
if (args[0] === false) {
// Default browsers message
- msg =
- 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');
+ msg = 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');
data.extra.arguments = args.slice(1);
callback && callback(msg, data);
}
} else {
callback && callback(msg, data);
- }
+ } // this fails for some browsers. :(
+
- // this fails for some browsers. :(
if (originalConsoleLevel) {
// IE9 doesn't allow calling apply on console functions directly
// See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193
@@ -1735,12 +1854,6 @@ typeof navigator === "object" && (function () {
/*global XDomainRequest:false */
-
-
-
-
-
-
var isErrorEvent$1 = utils.isErrorEvent;
var isDOMError$1 = utils.isDOMError;
var isDOMException$1 = utils.isDOMException;
@@ -1770,38 +1883,32 @@ typeof navigator === "object" && (function () {
var serializeKeysForMessage$1 = utils.serializeKeysForMessage;
var serializeException$1 = utils.serializeException;
var sanitize$1 = utils.sanitize;
-
var wrapConsoleMethod = console$1.wrapMethod;
-
var dsnKeys = 'source protocol user pass host port path'.split(' '),
- dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;
+ dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;
function now() {
return +new Date();
- }
+ } // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
+
+
+ var _window$2 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
- // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
- var _window$2 =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
var _document = _window$2.document;
var _navigator = _window$2.navigator;
function keepOriginalCallback(original, callback) {
- return isFunction$1(callback)
- ? function(data) {
- return callback(data, original);
- }
- : callback;
- }
-
- // First, check for JSON support
+ return isFunction$1(callback) ? function (data) {
+ return callback(data, original);
+ } : callback;
+ } // First, check for JSON support
// If there is no JSON, we no-op the core features of Raven
// since JSON is required to encode the payload
+
+
function Raven() {
- this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);
- // Raven can run in contexts where there's no document (react-native)
+ this._hasJSON = !!((typeof JSON === "undefined" ? "undefined" : _typeof(JSON)) === 'object' && JSON.stringify); // Raven can run in contexts where there's no document (react-native)
+
this._hasDocument = !isUndefined$1(_document);
this._hasNavigator = !isUndefined$1(_navigator);
this._lastCapturedException = null;
@@ -1841,9 +1948,9 @@ typeof navigator === "object" && (function () {
};
this._ignoreOnError = 0;
this._isRavenInstalled = false;
- this._originalErrorStackTraceLimit = Error.stackTraceLimit;
- // capture references to window.console *and* all its methods first
+ this._originalErrorStackTraceLimit = Error.stackTraceLimit; // capture references to window.console *and* all its methods first
// before the console plugin has a chance to monkey patch
+
this._originalConsole = _window$2.console || {};
this._originalConsoleMethods = {};
this._plugins = [];
@@ -1854,30 +1961,30 @@ typeof navigator === "object" && (function () {
this._keypressTimeout;
this._location = _window$2.location;
this._lastHref = this._location && this._location.href;
- this._resetBackoff();
- // eslint-disable-next-line guard-for-in
+ this._resetBackoff(); // eslint-disable-next-line guard-for-in
+
+
for (var method in this._originalConsole) {
this._originalConsoleMethods[method] = this._originalConsole[method];
}
}
-
/*
* The core Raven singleton
*
* @this {Raven}
*/
+
Raven.prototype = {
// Hardcode version string so that raven source can be loaded directly via
// webpack (using a build step causes webpack #1617). Grunt verifies that
// this value matches package.json during build.
// See: https://github.com/getsentry/raven-js/issues/465
VERSION: '3.27.0',
-
debug: false,
-
- TraceKit: tracekit, // alias to TraceKit
+ TraceKit: tracekit,
+ // alias to TraceKit
/*
* Configure Raven with a DSN and extra options
@@ -1886,20 +1993,20 @@ typeof navigator === "object" && (function () {
* @param {object} options Set of global options [optional]
* @return {Raven}
*/
- config: function(dsn, options) {
+ config: function config(dsn, options) {
var self = this;
if (self._globalServer) {
this._logDebug('error', 'Error: Raven has already been configured');
+
return self;
}
- if (!dsn) return self;
- var globalOptions = self._globalOptions;
+ if (!dsn) return self;
+ var globalOptions = self._globalOptions; // merge in options
- // merge in options
if (options) {
- each$1(options, function(key, value) {
+ each$1(options, function (key, value) {
// tags and extra are special and need to be put into context
if (key === 'tags' || key === 'extra' || key === 'user') {
self._globalContext[key] = value;
@@ -1909,26 +2016,17 @@ typeof navigator === "object" && (function () {
});
}
- self.setDSN(dsn);
-
- // "Script error." is hard coded into browsers for errors that it can't read.
+ self.setDSN(dsn); // "Script error." is hard coded into browsers for errors that it can't read.
// this is the result of a script being pulled in from an external domain and CORS.
+
globalOptions.ignoreErrors.push(/^Script error\.?$/);
- globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/);
+ globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); // join regexp rules into one big rule
- // join regexp rules into one big rule
globalOptions.ignoreErrors = joinRegExp$1(globalOptions.ignoreErrors);
- globalOptions.ignoreUrls = globalOptions.ignoreUrls.length
- ? joinRegExp$1(globalOptions.ignoreUrls)
- : false;
- globalOptions.whitelistUrls = globalOptions.whitelistUrls.length
- ? joinRegExp$1(globalOptions.whitelistUrls)
- : false;
+ globalOptions.ignoreUrls = globalOptions.ignoreUrls.length ? joinRegExp$1(globalOptions.ignoreUrls) : false;
+ globalOptions.whitelistUrls = globalOptions.whitelistUrls.length ? joinRegExp$1(globalOptions.whitelistUrls) : false;
globalOptions.includePaths = joinRegExp$1(globalOptions.includePaths);
- globalOptions.maxBreadcrumbs = Math.max(
- 0,
- Math.min(globalOptions.maxBreadcrumbs || 100, 100)
- ); // default and hard limit is 100
+ globalOptions.maxBreadcrumbs = Math.max(0, Math.min(globalOptions.maxBreadcrumbs || 100, 100)); // default and hard limit is 100
var autoBreadcrumbDefaults = {
xhr: true,
@@ -1937,30 +2035,29 @@ typeof navigator === "object" && (function () {
location: true,
sentry: true
};
-
var autoBreadcrumbs = globalOptions.autoBreadcrumbs;
+
if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {
autoBreadcrumbs = objectMerge$1(autoBreadcrumbDefaults, autoBreadcrumbs);
} else if (autoBreadcrumbs !== false) {
autoBreadcrumbs = autoBreadcrumbDefaults;
}
- globalOptions.autoBreadcrumbs = autoBreadcrumbs;
+ globalOptions.autoBreadcrumbs = autoBreadcrumbs;
var instrumentDefaults = {
tryCatch: true
};
-
var instrument = globalOptions.instrument;
+
if ({}.toString.call(instrument) === '[object Object]') {
instrument = objectMerge$1(instrumentDefaults, instrument);
} else if (instrument !== false) {
instrument = instrumentDefaults;
}
- globalOptions.instrument = instrument;
- tracekit.collectWindowErrors = !!globalOptions.collectWindowErrors;
+ globalOptions.instrument = instrument;
+ tracekit.collectWindowErrors = !!globalOptions.collectWindowErrors; // return for chaining
- // return for chaining
return self;
},
@@ -1972,10 +2069,11 @@ typeof navigator === "object" && (function () {
*
* @return {Raven}
*/
- install: function() {
+ install: function install() {
var self = this;
+
if (self.isSetup() && !self._isRavenInstalled) {
- tracekit.report.subscribe(function() {
+ tracekit.report.subscribe(function () {
self._handleOnErrorStackInfo.apply(self, arguments);
});
@@ -1989,9 +2087,8 @@ typeof navigator === "object" && (function () {
self._instrumentTryCatch();
}
- if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();
+ if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); // Install all of the plugins
- // Install all of the plugins
self._drainPlugins();
self._isRavenInstalled = true;
@@ -2006,24 +2103,20 @@ typeof navigator === "object" && (function () {
*
* @param {string} dsn The public Sentry DSN
*/
- setDSN: function(dsn) {
+ setDSN: function setDSN(dsn) {
var self = this,
- uri = self._parseDSN(dsn),
- lastSlash = uri.path.lastIndexOf('/'),
- path = uri.path.substr(1, lastSlash);
+ uri = self._parseDSN(dsn),
+ lastSlash = uri.path.lastIndexOf('/'),
+ path = uri.path.substr(1, lastSlash);
self._dsn = dsn;
self._globalKey = uri.user;
self._globalSecret = uri.pass && uri.pass.substr(1);
self._globalProject = uri.path.substr(lastSlash + 1);
-
self._globalServer = self._getGlobalServer(uri);
-
- self._globalEndpoint =
- self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';
-
- // Reset backoff state since we may be pointing at a
+ self._globalEndpoint = self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/'; // Reset backoff state since we may be pointing at a
// new project/server
+
this._resetBackoff();
},
@@ -2035,7 +2128,7 @@ typeof navigator === "object" && (function () {
* @param {function} func The callback to be immediately executed within the context
* @param {array} args An array of arguments to be called with the callback [optional]
*/
- context: function(options, func, args) {
+ context: function context(options, func, args) {
if (isFunction$1(options)) {
args = func || [];
func = options;
@@ -2053,33 +2146,33 @@ typeof navigator === "object" && (function () {
* @param {function} _before A function to call before the try/catch wrapper [optional, private]
* @return {function} The newly wrapped functions with a context
*/
- wrap: function(options, func, _before) {
- var self = this;
- // 1 argument has been passed, and it's not a function
+ wrap: function wrap(options, func, _before) {
+ var self = this; // 1 argument has been passed, and it's not a function
// so just return it
+
if (isUndefined$1(func) && !isFunction$1(options)) {
return options;
- }
+ } // options is optional
+
- // options is optional
if (isFunction$1(options)) {
func = options;
options = undefined;
- }
-
- // At this point, we've passed along 2 arguments, and the second one
+ } // At this point, we've passed along 2 arguments, and the second one
// is not a function either, so we'll just return the second argument.
+
+
if (!isFunction$1(func)) {
return func;
- }
+ } // We don't wanna wrap it twice!
+
- // We don't wanna wrap it twice!
try {
if (func.__raven__) {
return func;
- }
+ } // If this has already been wrapped in the past, return that
+
- // If this has already been wrapped in the past, return that
if (func.__raven_wrapper__) {
return func.__raven_wrapper__;
}
@@ -2092,16 +2185,18 @@ typeof navigator === "object" && (function () {
function wrapped() {
var args = [],
- i = arguments.length,
- deep = !options || (options && options.deep !== false);
+ i = arguments.length,
+ deep = !options || options && options.deep !== false;
if (_before && isFunction$1(_before)) {
_before.apply(this, arguments);
- }
-
- // Recursively wrap all of a function's arguments that are
+ } // Recursively wrap all of a function's arguments that are
// functions themselves.
- while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];
+
+
+ while (i--) {
+ args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];
+ }
try {
// Attempt to invoke user-land function
@@ -2111,25 +2206,25 @@ typeof navigator === "object" && (function () {
return func.apply(this, args);
} catch (e) {
self._ignoreNextOnError();
+
self.captureException(e, options);
throw e;
}
- }
+ } // copy over properties of the old function
+
- // copy over properties of the old function
for (var property in func) {
if (hasKey$1(func, property)) {
wrapped[property] = func[property];
}
}
- wrapped.prototype = func.prototype;
- func.__raven_wrapper__ = wrapped;
- // Signal that this function has been wrapped/filled already
+ wrapped.prototype = func.prototype;
+ func.__raven_wrapper__ = wrapped; // Signal that this function has been wrapped/filled already
// for both debugging and to prevent it to being wrapped/filled twice
+
wrapped.__raven__ = true;
wrapped.__orig__ = func;
-
return wrapped;
},
@@ -2138,17 +2233,19 @@ typeof navigator === "object" && (function () {
*
* @return {Raven}
*/
- uninstall: function() {
+ uninstall: function uninstall() {
tracekit.report.uninstall();
this._detachPromiseRejectionHandler();
+
this._unpatchFunctionToString();
+
this._restoreBuiltIns();
+
this._restoreConsole();
Error.stackTraceLimit = this._originalErrorStackTraceLimit;
this._isRavenInstalled = false;
-
return this;
},
@@ -2160,8 +2257,9 @@ typeof navigator === "object" && (function () {
* reason: the value with which the Promise was rejected
* @return void
*/
- _promiseRejectionHandler: function(event) {
+ _promiseRejectionHandler: function _promiseRejectionHandler(event) {
this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);
+
this.captureException(event.reason, {
mechanism: {
type: 'onunhandledrejection',
@@ -2175,10 +2273,9 @@ typeof navigator === "object" && (function () {
*
* @return {raven}
*/
- _attachPromiseRejectionHandler: function() {
+ _attachPromiseRejectionHandler: function _attachPromiseRejectionHandler() {
this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);
- _window$2.addEventListener &&
- _window$2.addEventListener('unhandledrejection', this._promiseRejectionHandler);
+ _window$2.addEventListener && _window$2.addEventListener('unhandledrejection', this._promiseRejectionHandler);
return this;
},
@@ -2187,9 +2284,8 @@ typeof navigator === "object" && (function () {
*
* @return {raven}
*/
- _detachPromiseRejectionHandler: function() {
- _window$2.removeEventListener &&
- _window$2.removeEventListener('unhandledrejection', this._promiseRejectionHandler);
+ _detachPromiseRejectionHandler: function _detachPromiseRejectionHandler() {
+ _window$2.removeEventListener && _window$2.removeEventListener('unhandledrejection', this._promiseRejectionHandler);
return this;
},
@@ -2200,8 +2296,10 @@ typeof navigator === "object" && (function () {
* @param {object} options A specific set of options for this error [optional]
* @return {Raven}
*/
- captureException: function(ex, options) {
- options = objectMerge$1({trimHeadFrames: 0}, options ? options : {});
+ captureException: function captureException(ex, options) {
+ options = objectMerge$1({
+ trimHeadFrames: 0
+ }, options ? options : {});
if (isErrorEvent$1(ex) && ex.error) {
// If it is an ErrorEvent with `error` property, extract it to get actual Error
@@ -2213,16 +2311,12 @@ typeof navigator === "object" && (function () {
// https://developer.mozilla.org/en-US/docs/Web/API/DOMException
var name = ex.name || (isDOMError$1(ex) ? 'DOMError' : 'DOMException');
var message = ex.message ? name + ': ' + ex.message : name;
-
- return this.captureMessage(
- message,
- objectMerge$1(options, {
- // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well
- // but it's barely any overhead so we may at least try
- stacktrace: true,
- trimHeadFrames: options.trimHeadFrames + 1
- })
- );
+ return this.captureMessage(message, objectMerge$1(options, {
+ // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well
+ // but it's barely any overhead so we may at least try
+ stacktrace: true,
+ trimHeadFrames: options.trimHeadFrames + 1
+ }));
} else if (isError$1(ex)) {
// we have a real Error object
ex = ex;
@@ -2239,25 +2333,23 @@ typeof navigator === "object" && (function () {
// it's not a valid ErrorEvent (one with an error property)
// it's not an Error
// So bail out and capture it as a simple message:
- return this.captureMessage(
- ex,
- objectMerge$1(options, {
- stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace
- trimHeadFrames: options.trimHeadFrames + 1
- })
- );
- }
+ return this.captureMessage(ex, objectMerge$1(options, {
+ stacktrace: true,
+ // if we fall back to captureMessage, default to attempting a new trace
+ trimHeadFrames: options.trimHeadFrames + 1
+ }));
+ } // Store the raw exception object for potential debugging and introspection
- // Store the raw exception object for potential debugging and introspection
- this._lastCapturedException = ex;
- // TraceKit.report will re-raise any exception passed to it,
+ this._lastCapturedException = ex; // TraceKit.report will re-raise any exception passed to it,
// which means you have to wrap it in try/catch. Instead, we
// can wrap it here and only re-raise if TraceKit.report
// raises an exception different from the one we asked to
// report on.
+
try {
var stack = tracekit.computeStackTrace(ex);
+
this._handleStackInfo(stack, options);
} catch (ex1) {
if (ex !== ex1) {
@@ -2267,17 +2359,14 @@ typeof navigator === "object" && (function () {
return this;
},
-
- _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {
+ _getCaptureExceptionOptionsFromPlainObject: function _getCaptureExceptionOptionsFromPlainObject(currentOptions, ex) {
var exKeys = Object.keys(ex).sort();
var options = objectMerge$1(currentOptions, {
- message:
- 'Non-Error exception captured with keys: ' + serializeKeysForMessage$1(exKeys),
+ message: 'Non-Error exception captured with keys: ' + serializeKeysForMessage$1(exKeys),
fingerprint: [md5_1(exKeys)],
extra: currentOptions.extra || {}
});
options.extra.__serialized__ = serializeException$1(ex);
-
return options;
},
@@ -2288,113 +2377,89 @@ typeof navigator === "object" && (function () {
* @param {object} options A specific set of options for this message [optional]
* @return {Raven}
*/
- captureMessage: function(msg, options) {
+ captureMessage: function captureMessage(msg, options) {
// config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an
// early call; we'll error on the side of logging anything called before configuration since it's
// probably something you should see:
- if (
- !!this._globalOptions.ignoreErrors.test &&
- this._globalOptions.ignoreErrors.test(msg)
- ) {
+ if (!!this._globalOptions.ignoreErrors.test && this._globalOptions.ignoreErrors.test(msg)) {
return;
}
options = options || {};
msg = msg + ''; // Make sure it's actually a string
- var data = objectMerge$1(
- {
- message: msg
- },
- options
- );
-
- var ex;
- // Generate a "synthetic" stack trace from this point.
+ var data = objectMerge$1({
+ message: msg
+ }, options);
+ var ex; // Generate a "synthetic" stack trace from this point.
// NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative
// 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 {
throw new Error(msg);
} catch (ex1) {
ex = ex1;
- }
+ } // null exception name so `Error` isn't prefixed to msg
- // null exception name so `Error` isn't prefixed to msg
- ex.name = null;
- var stack = tracekit.computeStackTrace(ex);
- // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]
- var initialCall = isArray$1(stack.stack) && stack.stack[1];
+ ex.name = null;
+ var stack = tracekit.computeStackTrace(ex); // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]
- // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call
+ var initialCall = isArray$1(stack.stack) && stack.stack[1]; // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call
// to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd
// initialCall => captureException(string) => captureMessage(string)
+
if (initialCall && initialCall.func === 'Raven.captureException') {
initialCall = stack.stack[2];
}
- var fileurl = (initialCall && initialCall.url) || '';
+ var fileurl = initialCall && initialCall.url || '';
- if (
- !!this._globalOptions.ignoreUrls.test &&
- this._globalOptions.ignoreUrls.test(fileurl)
- ) {
+ if (!!this._globalOptions.ignoreUrls.test && this._globalOptions.ignoreUrls.test(fileurl)) {
return;
}
- if (
- !!this._globalOptions.whitelistUrls.test &&
- !this._globalOptions.whitelistUrls.test(fileurl)
- ) {
+ if (!!this._globalOptions.whitelistUrls.test && !this._globalOptions.whitelistUrls.test(fileurl)) {
return;
- }
-
- // Always attempt to get stacktrace if message is empty.
+ } // Always attempt to get stacktrace if message is empty.
// It's the only way to provide any helpful information to the user.
+
+
if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') {
// fingerprint on msg, not stack trace (legacy behavior, could be revisited)
data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;
-
- options = objectMerge$1(
- {
- trimHeadFrames: 0
- },
- options
- );
- // Since we know this is a synthetic trace, the top frame (this function call)
+ options = objectMerge$1({
+ trimHeadFrames: 0
+ }, options); // Since we know this is a synthetic trace, the top frame (this function call)
// MUST be from Raven.js, so mark it for trimming
// We add to the trim counter so that callers can choose to trim extra frames, such
// as utility functions.
+
options.trimHeadFrames += 1;
var frames = this._prepareFrames(stack, options);
+
data.stacktrace = {
// Sentry expects frames oldest to newest
frames: frames.reverse()
};
- }
+ } // Make sure that fingerprint is always wrapped in an array
+
- // Make sure that fingerprint is always wrapped in an array
if (data.fingerprint) {
- data.fingerprint = isArray$1(data.fingerprint)
- ? data.fingerprint
- : [data.fingerprint];
- }
+ data.fingerprint = isArray$1(data.fingerprint) ? data.fingerprint : [data.fingerprint];
+ } // Fire away!
+
- // Fire away!
this._send(data);
return this;
},
-
- captureBreadcrumb: function(obj) {
- var crumb = objectMerge$1(
- {
- timestamp: now() / 1000
- },
- obj
- );
+ captureBreadcrumb: function captureBreadcrumb(obj) {
+ var crumb = objectMerge$1({
+ timestamp: now() / 1000
+ }, obj);
if (isFunction$1(this._globalOptions.breadcrumbCallback)) {
var result = this._globalOptions.breadcrumbCallback(crumb);
@@ -2407,16 +2472,20 @@ typeof navigator === "object" && (function () {
}
this._breadcrumbs.push(crumb);
+
if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {
this._breadcrumbs.shift();
}
+
return this;
},
-
- addPlugin: function(plugin /*arg1, arg2, ... argN*/) {
+ addPlugin: function addPlugin(plugin
+ /*arg1, arg2, ... argN*/
+ ) {
var pluginArgs = [].slice.call(arguments, 1);
this._plugins.push([plugin, pluginArgs]);
+
if (this._isRavenInstalled) {
this._drainPlugins();
}
@@ -2430,10 +2499,9 @@ typeof navigator === "object" && (function () {
* @param {object} user An object representing user data [optional]
* @return {Raven}
*/
- setUserContext: function(user) {
+ setUserContext: function setUserContext(user) {
// Intentionally do not merge here since that's an unexpected behavior.
this._globalContext.user = user;
-
return this;
},
@@ -2443,7 +2511,7 @@ typeof navigator === "object" && (function () {
* @param {object} extra An object representing extra data [optional]
* @return {Raven}
*/
- setExtraContext: function(extra) {
+ setExtraContext: function setExtraContext(extra) {
this._mergeContext('extra', extra);
return this;
@@ -2455,7 +2523,7 @@ typeof navigator === "object" && (function () {
* @param {object} tags An object representing tags [optional]
* @return {Raven}
*/
- setTagsContext: function(tags) {
+ setTagsContext: function setTagsContext(tags) {
this._mergeContext('tags', tags);
return this;
@@ -2466,9 +2534,8 @@ typeof navigator === "object" && (function () {
*
* @return {Raven}
*/
- clearContext: function() {
+ clearContext: function clearContext() {
this._globalContext = {};
-
return this;
},
@@ -2477,7 +2544,7 @@ typeof navigator === "object" && (function () {
*
* @return {object} copy of context
*/
- getContext: function() {
+ getContext: function getContext() {
// lol javascript
return JSON.parse(stringify_1(this._globalContext));
},
@@ -2488,9 +2555,8 @@ typeof navigator === "object" && (function () {
* @param {string} environment Typically something like 'production'.
* @return {Raven}
*/
- setEnvironment: function(environment) {
+ setEnvironment: function setEnvironment(environment) {
this._globalOptions.environment = environment;
-
return this;
},
@@ -2500,9 +2566,8 @@ typeof navigator === "object" && (function () {
* @param {string} release Typically something like a git SHA to identify version
* @return {Raven}
*/
- setRelease: function(release) {
+ setRelease: function setRelease(release) {
this._globalOptions.release = release;
-
return this;
},
@@ -2513,7 +2578,7 @@ typeof navigator === "object" && (function () {
* data blob to be mutated before sending
* @return {Raven}
*/
- setDataCallback: function(callback) {
+ setDataCallback: function setDataCallback(callback) {
var original = this._globalOptions.dataCallback;
this._globalOptions.dataCallback = keepOriginalCallback(original, callback);
return this;
@@ -2526,7 +2591,7 @@ typeof navigator === "object" && (function () {
* or mutating breadcrumbs
* @return {Raven}
*/
- setBreadcrumbCallback: function(callback) {
+ setBreadcrumbCallback: function setBreadcrumbCallback(callback) {
var original = this._globalOptions.breadcrumbCallback;
this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);
return this;
@@ -2539,7 +2604,7 @@ typeof navigator === "object" && (function () {
* introspecting the blob before sending
* @return {Raven}
*/
- setShouldSendCallback: function(callback) {
+ setShouldSendCallback: function setShouldSendCallback(callback) {
var original = this._globalOptions.shouldSendCallback;
this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);
return this;
@@ -2554,9 +2619,8 @@ typeof navigator === "object" && (function () {
*
* @return {Raven}
*/
- setTransport: function(transport) {
+ setTransport: function setTransport(transport) {
this._globalOptions.transport = transport;
-
return this;
},
@@ -2565,7 +2629,7 @@ typeof navigator === "object" && (function () {
*
* @return {error}
*/
- lastException: function() {
+ lastException: function lastException() {
return this._lastCapturedException;
},
@@ -2574,7 +2638,7 @@ typeof navigator === "object" && (function () {
*
* @return {string}
*/
- lastEventId: function() {
+ lastEventId: function lastEventId() {
return this._lastEventId;
},
@@ -2583,42 +2647,38 @@ typeof navigator === "object" && (function () {
*
* @return {boolean}
*/
- isSetup: function() {
+ isSetup: function isSetup() {
if (!this._hasJSON) return false; // needs JSON support
+
if (!this._globalServer) {
if (!this.ravenNotConfiguredError) {
this.ravenNotConfiguredError = true;
+
this._logDebug('error', 'Error: Raven has not been configured.');
}
+
return false;
}
+
return true;
},
-
- afterLoad: function() {
+ afterLoad: function afterLoad() {
// TODO: remove window dependence?
-
// Attempt to initialize Raven on load
var RavenConfig = _window$2.RavenConfig;
+
if (RavenConfig) {
this.config(RavenConfig.dsn, RavenConfig.config).install();
}
},
-
- showReportDialog: function(options) {
- if (
- !_document // doesn't work without a document (React native)
- )
- return;
-
- options = objectMerge$1(
- {
- eventId: this.lastEventId(),
- dsn: this._dsn,
- user: this._globalContext.user || {}
- },
- options
- );
+ showReportDialog: function showReportDialog(options) {
+ if (!_document // doesn't work without a document (React native)
+ ) return;
+ options = objectMerge$1({
+ eventId: this.lastEventId(),
+ dsn: this._dsn,
+ user: this._globalContext.user || {}
+ }, options);
if (!options.eventId) {
throw new configError('Missing eventId');
@@ -2640,32 +2700,31 @@ typeof navigator === "object" && (function () {
encodedOptions.push(encode(key) + '=' + encode(options[key]));
}
}
+
var globalServer = this._getGlobalServer(this._parseDSN(options.dsn));
var script = _document.createElement('script');
+
script.async = true;
script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&');
+
(_document.head || _document.body).appendChild(script);
},
/**** Private functions ****/
- _ignoreNextOnError: function() {
+ _ignoreNextOnError: function _ignoreNextOnError() {
var self = this;
this._ignoreOnError += 1;
- setTimeout(function() {
+ setTimeout(function () {
// onerror should trigger before setTimeout
self._ignoreOnError -= 1;
});
},
-
- _triggerEvent: function(eventType, options) {
+ _triggerEvent: function _triggerEvent(eventType, options) {
// NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it
var evt, key;
-
if (!this._hasDocument) return;
-
options = options || {};
-
eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);
if (_document.createEvent) {
@@ -2676,10 +2735,11 @@ typeof navigator === "object" && (function () {
evt.eventType = eventType;
}
- for (key in options)
+ for (key in options) {
if (hasKey$1(options, key)) {
evt[key] = options[key];
}
+ }
if (_document.createEvent) {
// IE9 if standards
@@ -2689,8 +2749,7 @@ typeof navigator === "object" && (function () {
// IE9 if quirks
try {
_document.fireEvent('on' + evt.eventType.toLowerCase(), evt);
- } catch (e) {
- // Do nothing
+ } catch (e) {// Do nothing
}
}
},
@@ -2701,26 +2760,24 @@ typeof navigator === "object" && (function () {
* @returns {Function}
* @private
*/
- _breadcrumbEventHandler: function(evtName) {
+ _breadcrumbEventHandler: function _breadcrumbEventHandler(evtName) {
var self = this;
- return function(evt) {
+ return function (evt) {
// reset keypress timeout; e.g. triggering a 'click' after
// a 'keypress' will reset the keypress debounce so that a new
// set of keypresses can be recorded
- self._keypressTimeout = null;
-
- // It's possible this handler might trigger multiple times for the same
+ self._keypressTimeout = null; // It's possible this handler might trigger multiple times for the same
// event (e.g. event propagation through node ancestors). Ignore if we've
// already captured the event.
- if (self._lastCapturedEvent === evt) return;
-
- self._lastCapturedEvent = evt;
- // try/catch both:
+ if (self._lastCapturedEvent === evt) return;
+ self._lastCapturedEvent = evt; // try/catch both:
// - accessing evt.target (see getsentry/raven-js#838, #768)
// - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
// can throw an exception in some circumstances.
+
var target;
+
try {
target = htmlTreeAsString$1(evt.target);
} catch (e) {
@@ -2728,7 +2785,8 @@ typeof navigator === "object" && (function () {
}
self.captureBreadcrumb({
- category: 'ui.' + evtName, // e.g. ui.click, ui.input
+ category: 'ui.' + evtName,
+ // e.g. ui.click, ui.input
message: target
});
};
@@ -2739,15 +2797,16 @@ typeof navigator === "object" && (function () {
* @returns {Function}
* @private
*/
- _keypressEventHandler: function() {
+ _keypressEventHandler: function _keypressEventHandler() {
var self = this,
- debounceDuration = 1000; // milliseconds
-
+ debounceDuration = 1000; // milliseconds
// TODO: if somehow user switches keypress target before
// debounce timeout is triggered, we will only capture
// a single breadcrumb from the FIRST target (acceptable?)
- return function(evt) {
+
+ return function (evt) {
var target;
+
try {
target = evt.target;
} catch (e) {
@@ -2755,25 +2814,22 @@ typeof navigator === "object" && (function () {
// see: https://github.com/getsentry/raven-js/issues/838
return;
}
- var tagName = target && target.tagName;
- // only consider keypress events on actual input elements
+ var tagName = target && target.tagName; // only consider keypress events on actual input elements
// this will disregard keypresses targeting body (e.g. tabbing
// through elements, hotkeys, etc)
- if (
- !tagName ||
- (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)
- )
- return;
- // record first keypress in a series, but ignore subsequent
+ if (!tagName || tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) return; // record first keypress in a series, but ignore subsequent
// keypresses until debounce clears
+
var timeout = self._keypressTimeout;
+
if (!timeout) {
self._breadcrumbEventHandler('input')(evt);
}
+
clearTimeout(timeout);
- self._keypressTimeout = setTimeout(function() {
+ self._keypressTimeout = setTimeout(function () {
self._keypressTimeout = null;
}, debounceDuration);
};
@@ -2785,23 +2841,18 @@ typeof navigator === "object" && (function () {
* @param from the target URL
* @private
*/
- _captureUrlChange: function(from, to) {
+ _captureUrlChange: function _captureUrlChange(from, to) {
var parsedLoc = parseUrl$1(this._location.href);
var parsedTo = parseUrl$1(to);
- var parsedFrom = parseUrl$1(from);
-
- // because onpopstate only tells you the "new" (to) value of location.href, and
+ var parsedFrom = parseUrl$1(from); // because onpopstate only tells you the "new" (to) value of location.href, and
// not the previous (from) value, we need to track the value of the current URL
// state ourselves
- this._lastHref = to;
- // Use only the path component of the URL if the URL matches the current
+ this._lastHref = to; // Use only the path component of the URL if the URL matches the current
// document (almost all the time when using pushState)
- if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)
- to = parsedTo.relative;
- if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)
- from = parsedFrom.relative;
+ if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) to = parsedTo.relative;
+ if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) from = parsedFrom.relative;
this.captureBreadcrumb({
category: 'navigation',
data: {
@@ -2810,20 +2861,19 @@ typeof navigator === "object" && (function () {
}
});
},
-
- _patchFunctionToString: function() {
+ _patchFunctionToString: function _patchFunctionToString() {
var self = this;
- self._originalFunctionToString = Function.prototype.toString;
- // eslint-disable-next-line no-extend-native
- Function.prototype.toString = function() {
+ self._originalFunctionToString = Function.prototype.toString; // eslint-disable-next-line no-extend-native
+
+ Function.prototype.toString = function () {
if (typeof this === 'function' && this.__raven__) {
return self._originalFunctionToString.apply(this.__orig__, arguments);
}
+
return self._originalFunctionToString.apply(this, arguments);
};
},
-
- _unpatchFunctionToString: function() {
+ _unpatchFunctionToString: function _unpatchFunctionToString() {
if (this._originalFunctionToString) {
// eslint-disable-next-line no-extend-native
Function.prototype.toString = this._originalFunctionToString;
@@ -2834,36 +2884,37 @@ typeof navigator === "object" && (function () {
* Wrap timer functions and event targets to catch errors and provide
* better metadata.
*/
- _instrumentTryCatch: function() {
+ _instrumentTryCatch: function _instrumentTryCatch() {
var self = this;
-
var wrappedBuiltIns = self._wrappedBuiltIns;
function wrapTimeFn(orig) {
- return function(fn, t) {
+ return function (fn, t) {
// preserve arity
// Make a copy of the arguments to prevent deoptimization
// https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
var args = new Array(arguments.length);
+
for (var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
+
var originalCallback = args[0];
+
if (isFunction$1(originalCallback)) {
- args[0] = self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {function: orig.name || '<anonymous>'}
+ args[0] = self.wrap({
+ mechanism: {
+ type: 'instrument',
+ data: {
+ function: orig.name || '<anonymous>'
}
- },
- originalCallback
- );
- }
-
- // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it
+ }
+ }, originalCallback);
+ } // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it
// also supports only two arguments and doesn't care what this is, so we
// can just call the original function directly.
+
+
if (orig.apply) {
return orig.apply(this, args);
} else {
@@ -2876,167 +2927,104 @@ typeof navigator === "object" && (function () {
function wrapEventTarget(global) {
var proto = _window$2[global] && _window$2[global].prototype;
- if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {
- fill$1(
- proto,
- 'addEventListener',
- function(orig) {
- return function(evtName, fn, capture, secure) {
- // preserve arity
- try {
- if (fn && fn.handleEvent) {
- fn.handleEvent = self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {
- target: global,
- function: 'handleEvent',
- handler: (fn && fn.name) || '<anonymous>'
- }
- }
- },
- fn.handleEvent
- );
- }
- } catch (err) {
- // can sometimes get 'Permission denied to access property "handle Event'
- }
- // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`
- // so that we don't have more than one wrapper function
- var before, clickHandler, keypressHandler;
-
- if (
- autoBreadcrumbs &&
- autoBreadcrumbs.dom &&
- (global === 'EventTarget' || global === 'Node')
- ) {
- // NOTE: generating multiple handlers per addEventListener invocation, should
- // revisit and verify we can just use one (almost certainly)
- clickHandler = self._breadcrumbEventHandler('click');
- keypressHandler = self._keypressEventHandler();
- before = function(evt) {
- // need to intercept every DOM event in `before` argument, in case that
- // same wrapped method is re-used for different events (e.g. mousemove THEN click)
- // see #724
- if (!evt) return;
-
- var eventType;
- try {
- eventType = evt.type;
- } catch (e) {
- // just accessing event properties can throw an exception in some rare circumstances
- // see: https://github.com/getsentry/raven-js/issues/838
- return;
+ if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {
+ fill$1(proto, 'addEventListener', function (orig) {
+ return function (evtName, fn, capture, secure) {
+ // preserve arity
+ try {
+ if (fn && fn.handleEvent) {
+ fn.handleEvent = self.wrap({
+ mechanism: {
+ type: 'instrument',
+ data: {
+ target: global,
+ function: 'handleEvent',
+ handler: fn && fn.name || '<anonymous>'
+ }
}
- if (eventType === 'click') return clickHandler(evt);
- else if (eventType === 'keypress') return keypressHandler(evt);
- };
+ }, fn.handleEvent);
}
- return orig.call(
- this,
- evtName,
- self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {
- target: global,
- function: 'addEventListener',
- handler: (fn && fn.name) || '<anonymous>'
- }
- }
- },
- fn,
- before
- ),
- capture,
- secure
- );
- };
- },
- wrappedBuiltIns
- );
- fill$1(
- proto,
- 'removeEventListener',
- function(orig) {
- return function(evt, fn, capture, secure) {
- try {
- fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);
- } catch (e) {
- // ignore, accessing __raven_wrapper__ will throw in some Selenium environments
+ } catch (err) {} // can sometimes get 'Permission denied to access property "handle Event'
+ // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`
+ // so that we don't have more than one wrapper function
+
+
+ var before, clickHandler, keypressHandler;
+
+ if (autoBreadcrumbs && autoBreadcrumbs.dom && (global === 'EventTarget' || global === 'Node')) {
+ // NOTE: generating multiple handlers per addEventListener invocation, should
+ // revisit and verify we can just use one (almost certainly)
+ clickHandler = self._breadcrumbEventHandler('click');
+ keypressHandler = self._keypressEventHandler();
+
+ before = function before(evt) {
+ // need to intercept every DOM event in `before` argument, in case that
+ // same wrapped method is re-used for different events (e.g. mousemove THEN click)
+ // see #724
+ if (!evt) return;
+ var eventType;
+
+ try {
+ eventType = evt.type;
+ } catch (e) {
+ // just accessing event properties can throw an exception in some rare circumstances
+ // see: https://github.com/getsentry/raven-js/issues/838
+ return;
+ }
+
+ if (eventType === 'click') return clickHandler(evt);else if (eventType === 'keypress') return keypressHandler(evt);
+ };
+ }
+
+ return orig.call(this, evtName, self.wrap({
+ mechanism: {
+ type: 'instrument',
+ data: {
+ target: global,
+ function: 'addEventListener',
+ handler: fn && fn.name || '<anonymous>'
+ }
}
- return orig.call(this, evt, fn, capture, secure);
- };
- },
- wrappedBuiltIns
- );
+ }, fn, before), capture, secure);
+ };
+ }, wrappedBuiltIns);
+ fill$1(proto, 'removeEventListener', function (orig) {
+ return function (evt, fn, capture, secure) {
+ try {
+ fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);
+ } catch (e) {// ignore, accessing __raven_wrapper__ will throw in some Selenium environments
+ }
+
+ return orig.call(this, evt, fn, capture, secure);
+ };
+ }, wrappedBuiltIns);
}
}
fill$1(_window$2, 'setTimeout', wrapTimeFn, wrappedBuiltIns);
fill$1(_window$2, 'setInterval', wrapTimeFn, wrappedBuiltIns);
- if (_window$2.requestAnimationFrame) {
- fill$1(
- _window$2,
- 'requestAnimationFrame',
- function(orig) {
- return function(cb) {
- return orig(
- self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {
- function: 'requestAnimationFrame',
- handler: (orig && orig.name) || '<anonymous>'
- }
- }
- },
- cb
- )
- );
- };
- },
- wrappedBuiltIns
- );
- }
- // event targets borrowed from bugsnag-js:
+ if (_window$2.requestAnimationFrame) {
+ fill$1(_window$2, 'requestAnimationFrame', function (orig) {
+ return function (cb) {
+ return orig(self.wrap({
+ mechanism: {
+ type: 'instrument',
+ data: {
+ function: 'requestAnimationFrame',
+ handler: orig && orig.name || '<anonymous>'
+ }
+ }
+ }, cb));
+ };
+ }, wrappedBuiltIns);
+ } // event targets borrowed from bugsnag-js:
// https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666
- var eventTargets = [
- 'EventTarget',
- 'Window',
- 'Node',
- 'ApplicationCache',
- 'AudioTrackList',
- 'ChannelMergerNode',
- 'CryptoOperation',
- 'EventSource',
- 'FileReader',
- 'HTMLUnknownElement',
- 'IDBDatabase',
- 'IDBRequest',
- 'IDBTransaction',
- 'KeyOperation',
- 'MediaController',
- 'MessagePort',
- 'ModalWindow',
- 'Notification',
- 'SVGElementInstance',
- 'Screen',
- 'TextTrack',
- 'TextTrackCue',
- 'TextTrackList',
- 'WebSocket',
- 'WebSocketWorker',
- 'Worker',
- 'XMLHttpRequest',
- 'XMLHttpRequestEventTarget',
- 'XMLHttpRequestUpload'
- ];
+
+
+ var eventTargets = ['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource', 'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController', 'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue', 'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'XMLHttpRequestUpload'];
+
for (var i = 0; i < eventTargets.length; i++) {
wrapEventTarget(eventTargets[i]);
}
@@ -3051,219 +3039,192 @@ typeof navigator === "object" && (function () {
*
* Can be disabled or individually configured via the `autoBreadcrumbs` config option
*/
- _instrumentBreadcrumbs: function() {
+ _instrumentBreadcrumbs: function _instrumentBreadcrumbs() {
var self = this;
var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;
-
var wrappedBuiltIns = self._wrappedBuiltIns;
function wrapProp(prop, xhr) {
if (prop in xhr && isFunction$1(xhr[prop])) {
- fill$1(xhr, prop, function(orig) {
- return self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}
+ fill$1(xhr, prop, function (orig) {
+ return self.wrap({
+ mechanism: {
+ type: 'instrument',
+ data: {
+ function: prop,
+ handler: orig && orig.name || '<anonymous>'
}
- },
- orig
- );
+ }
+ }, orig);
}); // intentionally don't track filled methods on XHR instances
}
}
if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window$2) {
var xhrproto = _window$2.XMLHttpRequest && _window$2.XMLHttpRequest.prototype;
- fill$1(
- xhrproto,
- 'open',
- function(origOpen) {
- return function(method, url) {
- // preserve arity
-
- // if Sentry key appears in URL, don't capture
- if (isString$1(url) && url.indexOf(self._globalKey) === -1) {
- this.__raven_xhr = {
- method: method,
- url: url,
- status_code: null
- };
- }
-
- return origOpen.apply(this, arguments);
- };
- },
- wrappedBuiltIns
- );
-
- fill$1(
- xhrproto,
- 'send',
- function(origSend) {
- return function() {
- // preserve arity
- var xhr = this;
-
- function onreadystatechangeHandler() {
- if (xhr.__raven_xhr && xhr.readyState === 4) {
- try {
- // touching statusCode in some platforms throws
- // an exception
- xhr.__raven_xhr.status_code = xhr.status;
- } catch (e) {
- /* do nothing */
- }
+ fill$1(xhrproto, 'open', function (origOpen) {
+ return function (method, url) {
+ // preserve arity
+ // if Sentry key appears in URL, don't capture
+ if (isString$1(url) && url.indexOf(self._globalKey) === -1) {
+ this.__raven_xhr = {
+ method: method,
+ url: url,
+ status_code: null
+ };
+ }
- self.captureBreadcrumb({
- type: 'http',
- category: 'xhr',
- data: xhr.__raven_xhr
- });
+ return origOpen.apply(this, arguments);
+ };
+ }, wrappedBuiltIns);
+ fill$1(xhrproto, 'send', function (origSend) {
+ return function () {
+ // preserve arity
+ var xhr = this;
+
+ function onreadystatechangeHandler() {
+ if (xhr.__raven_xhr && xhr.readyState === 4) {
+ try {
+ // touching statusCode in some platforms throws
+ // an exception
+ xhr.__raven_xhr.status_code = xhr.status;
+ } catch (e) {
+ /* do nothing */
}
- }
- var props = ['onload', 'onerror', 'onprogress'];
- for (var j = 0; j < props.length; j++) {
- wrapProp(props[j], xhr);
+ self.captureBreadcrumb({
+ type: 'http',
+ category: 'xhr',
+ data: xhr.__raven_xhr
+ });
}
+ }
- if ('onreadystatechange' in xhr && isFunction$1(xhr.onreadystatechange)) {
- fill$1(
- xhr,
- 'onreadystatechange',
- function(orig) {
- return self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {
- function: 'onreadystatechange',
- handler: (orig && orig.name) || '<anonymous>'
- }
- }
- },
- orig,
- onreadystatechangeHandler
- );
- } /* intentionally don't track this instrumentation */
- );
- } else {
- // if onreadystatechange wasn't actually set by the page on this xhr, we
- // are free to set our own and capture the breadcrumb
- xhr.onreadystatechange = onreadystatechangeHandler;
+ var props = ['onload', 'onerror', 'onprogress'];
+
+ for (var j = 0; j < props.length; j++) {
+ wrapProp(props[j], xhr);
+ }
+
+ if ('onreadystatechange' in xhr && isFunction$1(xhr.onreadystatechange)) {
+ fill$1(xhr, 'onreadystatechange', function (orig) {
+ return self.wrap({
+ mechanism: {
+ type: 'instrument',
+ data: {
+ function: 'onreadystatechange',
+ handler: orig && orig.name || '<anonymous>'
+ }
+ }
+ }, orig, onreadystatechangeHandler);
}
+ /* intentionally don't track this instrumentation */
+ );
+ } else {
+ // if onreadystatechange wasn't actually set by the page on this xhr, we
+ // are free to set our own and capture the breadcrumb
+ xhr.onreadystatechange = onreadystatechangeHandler;
+ }
- return origSend.apply(this, arguments);
- };
- },
- wrappedBuiltIns
- );
+ return origSend.apply(this, arguments);
+ };
+ }, wrappedBuiltIns);
}
if (autoBreadcrumbs.xhr && supportsFetch$1()) {
- fill$1(
- _window$2,
- 'fetch',
- function(origFetch) {
- return function() {
- // preserve arity
- // Make a copy of the arguments to prevent deoptimization
- // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
- var args = new Array(arguments.length);
- for (var i = 0; i < args.length; ++i) {
- args[i] = arguments[i];
- }
+ fill$1(_window$2, 'fetch', function (origFetch) {
+ return function () {
+ // preserve arity
+ // Make a copy of the arguments to prevent deoptimization
+ // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
+ var args = new Array(arguments.length);
+
+ for (var i = 0; i < args.length; ++i) {
+ args[i] = arguments[i];
+ }
- var fetchInput = args[0];
- var method = 'GET';
- var url;
+ var fetchInput = args[0];
+ var method = 'GET';
+ var url;
- if (typeof fetchInput === 'string') {
- url = fetchInput;
- } else if ('Request' in _window$2 && fetchInput instanceof _window$2.Request) {
- url = fetchInput.url;
- if (fetchInput.method) {
- method = fetchInput.method;
- }
- } else {
- url = '' + fetchInput;
- }
+ if (typeof fetchInput === 'string') {
+ url = fetchInput;
+ } else if ('Request' in _window$2 && fetchInput instanceof _window$2.Request) {
+ url = fetchInput.url;
- // if Sentry key appears in URL, don't capture, as it's our own request
- if (url.indexOf(self._globalKey) !== -1) {
- return origFetch.apply(this, args);
+ if (fetchInput.method) {
+ method = fetchInput.method;
}
+ } else {
+ url = '' + fetchInput;
+ } // if Sentry key appears in URL, don't capture, as it's our own request
- if (args[1] && args[1].method) {
- method = args[1].method;
- }
- var fetchData = {
- method: method,
- url: url,
- status_code: null
- };
+ if (url.indexOf(self._globalKey) !== -1) {
+ return origFetch.apply(this, args);
+ }
- return origFetch
- .apply(this, args)
- .then(function(response) {
- fetchData.status_code = response.status;
-
- self.captureBreadcrumb({
- type: 'http',
- category: 'fetch',
- data: fetchData
- });
-
- return response;
- })
- ['catch'](function(err) {
- // if there is an error performing the request
- self.captureBreadcrumb({
- type: 'http',
- category: 'fetch',
- data: fetchData,
- level: 'error'
- });
-
- throw err;
- });
- };
- },
- wrappedBuiltIns
- );
- }
+ if (args[1] && args[1].method) {
+ method = args[1].method;
+ }
- // Capture breadcrumbs from any click that is unhandled / bubbled up all the way
+ var fetchData = {
+ method: method,
+ url: url,
+ status_code: null
+ };
+ return origFetch.apply(this, args).then(function (response) {
+ fetchData.status_code = response.status;
+ self.captureBreadcrumb({
+ type: 'http',
+ category: 'fetch',
+ data: fetchData
+ });
+ return response;
+ })['catch'](function (err) {
+ // if there is an error performing the request
+ self.captureBreadcrumb({
+ type: 'http',
+ category: 'fetch',
+ data: fetchData,
+ level: 'error'
+ });
+ throw err;
+ });
+ };
+ }, wrappedBuiltIns);
+ } // Capture breadcrumbs from any click that is unhandled / bubbled up all the way
// to the document. Do this before we instrument addEventListener.
+
+
if (autoBreadcrumbs.dom && this._hasDocument) {
if (_document.addEventListener) {
_document.addEventListener('click', self._breadcrumbEventHandler('click'), false);
+
_document.addEventListener('keypress', self._keypressEventHandler(), false);
} else if (_document.attachEvent) {
// IE8 Compatibility
_document.attachEvent('onclick', self._breadcrumbEventHandler('click'));
+
_document.attachEvent('onkeypress', self._keypressEventHandler());
}
- }
-
- // record navigation (URL) changes
+ } // record navigation (URL) changes
// NOTE: in Chrome App environment, touching history.pushState, *even inside
// a try/catch block*, will cause Chrome to output an error to console.error
// borrowed from: https://github.com/angular/angular.js/pull/13945/files
+
+
var chrome = _window$2.chrome;
var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;
- var hasPushAndReplaceState =
- !isChromePackagedApp &&
- _window$2.history &&
- _window$2.history.pushState &&
- _window$2.history.replaceState;
+ var hasPushAndReplaceState = !isChromePackagedApp && _window$2.history && _window$2.history.pushState && _window$2.history.replaceState;
+
if (autoBreadcrumbs.location && hasPushAndReplaceState) {
// TODO: remove onpopstate handler on uninstall()
var oldOnPopState = _window$2.onpopstate;
- _window$2.onpopstate = function() {
+
+ _window$2.onpopstate = function () {
var currentHref = self._location.href;
+
self._captureUrlChange(self._lastHref, currentHref);
if (oldOnPopState) {
@@ -3271,13 +3232,14 @@ typeof navigator === "object" && (function () {
}
};
- var historyReplacementFunction = function(origHistFunction) {
+ var historyReplacementFunction = function historyReplacementFunction(origHistFunction) {
// note history.pushState.length is 0; intentionally not declaring
// params to preserve 0 arity
- return function(/* state, title, url */) {
- var url = arguments.length > 2 ? arguments[2] : undefined;
+ return function ()
+ /* state, title, url */
+ {
+ var url = arguments.length > 2 ? arguments[2] : undefined; // url argument is optional
- // url argument is optional
if (url) {
// coerce to string (this is what pushState does)
self._captureUrlChange(self._lastHref, url + '');
@@ -3293,7 +3255,7 @@ typeof navigator === "object" && (function () {
if (autoBreadcrumbs.console && 'console' in _window$2 && console.log) {
// console
- var consoleMethodCallback = function(msg, data) {
+ var consoleMethodCallback = function consoleMethodCallback(msg, data) {
self.captureBreadcrumb({
message: msg,
level: data.level,
@@ -3301,88 +3263,79 @@ typeof navigator === "object" && (function () {
});
};
- each$1(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {
+ each$1(['debug', 'info', 'warn', 'error', 'log'], function (_, level) {
wrapConsoleMethod(console, level, consoleMethodCallback);
});
}
},
-
- _restoreBuiltIns: function() {
+ _restoreBuiltIns: function _restoreBuiltIns() {
// restore any wrapped builtins
var builtin;
+
while (this._wrappedBuiltIns.length) {
builtin = this._wrappedBuiltIns.shift();
-
var obj = builtin[0],
- name = builtin[1],
- orig = builtin[2];
-
+ name = builtin[1],
+ orig = builtin[2];
obj[name] = orig;
}
},
-
- _restoreConsole: function() {
+ _restoreConsole: function _restoreConsole() {
// eslint-disable-next-line guard-for-in
for (var method in this._originalConsoleMethods) {
this._originalConsole[method] = this._originalConsoleMethods[method];
}
},
+ _drainPlugins: function _drainPlugins() {
+ var self = this; // FIX ME TODO
- _drainPlugins: function() {
- var self = this;
-
- // FIX ME TODO
- each$1(this._plugins, function(_, plugin) {
+ each$1(this._plugins, function (_, plugin) {
var installer = plugin[0];
var args = plugin[1];
installer.apply(self, [self].concat(args));
});
},
-
- _parseDSN: function(str) {
+ _parseDSN: function _parseDSN(str) {
var m = dsnPattern.exec(str),
- dsn = {},
- i = 7;
+ dsn = {},
+ i = 7;
try {
- while (i--) dsn[dsnKeys[i]] = m[i] || '';
+ while (i--) {
+ dsn[dsnKeys[i]] = m[i] || '';
+ }
} catch (e) {
throw new configError('Invalid DSN: ' + str);
}
if (dsn.pass && !this._globalOptions.allowSecretKey) {
- throw new configError(
- 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'
- );
+ throw new configError('Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key');
}
return dsn;
},
-
- _getGlobalServer: function(uri) {
+ _getGlobalServer: function _getGlobalServer(uri) {
// assemble the endpoint from the uri pieces
var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');
if (uri.protocol) {
globalServer = uri.protocol + ':' + globalServer;
}
+
return globalServer;
},
-
- _handleOnErrorStackInfo: function(stackInfo, options) {
+ _handleOnErrorStackInfo: function _handleOnErrorStackInfo(stackInfo, options) {
options = options || {};
options.mechanism = options.mechanism || {
type: 'onerror',
handled: false
- };
+ }; // if we are intentionally ignoring errors via onerror, bail out
- // if we are intentionally ignoring errors via onerror, bail out
if (!this._ignoreOnError) {
this._handleStackInfo(stackInfo, options);
}
},
-
- _handleStackInfo: function(stackInfo, options) {
+ _handleStackInfo: function _handleStackInfo(stackInfo, options) {
var frames = this._prepareFrames(stackInfo, options);
this._triggerEvent('handle', {
@@ -3390,216 +3343,180 @@ typeof navigator === "object" && (function () {
options: options
});
- this._processException(
- stackInfo.name,
- stackInfo.message,
- stackInfo.url,
- stackInfo.lineno,
- frames,
- options
- );
+ this._processException(stackInfo.name, stackInfo.message, stackInfo.url, stackInfo.lineno, frames, options);
},
-
- _prepareFrames: function(stackInfo, options) {
+ _prepareFrames: function _prepareFrames(stackInfo, options) {
var self = this;
var frames = [];
+
if (stackInfo.stack && stackInfo.stack.length) {
- each$1(stackInfo.stack, function(i, stack) {
+ each$1(stackInfo.stack, function (i, stack) {
var frame = self._normalizeFrame(stack, stackInfo.url);
+
if (frame) {
frames.push(frame);
}
- });
+ }); // e.g. frames captured via captureMessage throw
- // e.g. frames captured via captureMessage throw
if (options && options.trimHeadFrames) {
for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {
frames[j].in_app = false;
}
}
}
+
frames = frames.slice(0, this._globalOptions.stackTraceLimit);
return frames;
},
-
- _normalizeFrame: function(frame, stackInfoUrl) {
+ _normalizeFrame: function _normalizeFrame(frame, stackInfoUrl) {
// normalize the frames data
var normalized = {
filename: frame.url,
lineno: frame.line,
colno: frame.column,
function: frame.func || '?'
- };
-
- // Case when we don't have any information about the error
+ }; // Case when we don't have any information about the error
// E.g. throwing a string or raw object, instead of an `Error` in Firefox
// Generating synthetic error doesn't add any value here
//
// We should probably somehow let a user know that they should fix their code
+
if (!frame.url) {
normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler
}
- normalized.in_app = !// determine if an exception came from outside of our app
+ normalized.in_app = !( // determine if an exception came from outside of our app
// first we check the global includePaths list.
- (
- (!!this._globalOptions.includePaths.test &&
- !this._globalOptions.includePaths.test(normalized.filename)) ||
- // Now we check for fun, if the function name is Raven or TraceKit
- /(Raven|TraceKit)\./.test(normalized['function']) ||
- // finally, we do a last ditch effort and check for raven.min.js
- /raven\.(min\.)?js$/.test(normalized.filename)
- );
-
+ !!this._globalOptions.includePaths.test && !this._globalOptions.includePaths.test(normalized.filename) || // Now we check for fun, if the function name is Raven or TraceKit
+ /(Raven|TraceKit)\./.test(normalized['function']) || // finally, we do a last ditch effort and check for raven.min.js
+ /raven\.(min\.)?js$/.test(normalized.filename));
return normalized;
},
-
- _processException: function(type, message, fileurl, lineno, frames, options) {
+ _processException: function _processException(type, message, fileurl, lineno, frames, options) {
var prefixedMessage = (type ? type + ': ' : '') + (message || '');
- if (
- !!this._globalOptions.ignoreErrors.test &&
- (this._globalOptions.ignoreErrors.test(message) ||
- this._globalOptions.ignoreErrors.test(prefixedMessage))
- ) {
+
+ if (!!this._globalOptions.ignoreErrors.test && (this._globalOptions.ignoreErrors.test(message) || this._globalOptions.ignoreErrors.test(prefixedMessage))) {
return;
}
var stacktrace;
if (frames && frames.length) {
- fileurl = frames[0].filename || fileurl;
- // Sentry expects frames oldest to newest
+ fileurl = frames[0].filename || fileurl; // Sentry expects frames oldest to newest
// and JS sends them as newest to oldest
+
frames.reverse();
- stacktrace = {frames: frames};
+ stacktrace = {
+ frames: frames
+ };
} else if (fileurl) {
stacktrace = {
- frames: [
- {
- filename: fileurl,
- lineno: lineno,
- in_app: true
- }
- ]
+ frames: [{
+ filename: fileurl,
+ lineno: lineno,
+ in_app: true
+ }]
};
}
- if (
- !!this._globalOptions.ignoreUrls.test &&
- this._globalOptions.ignoreUrls.test(fileurl)
- ) {
+ if (!!this._globalOptions.ignoreUrls.test && this._globalOptions.ignoreUrls.test(fileurl)) {
return;
}
- if (
- !!this._globalOptions.whitelistUrls.test &&
- !this._globalOptions.whitelistUrls.test(fileurl)
- ) {
+ if (!!this._globalOptions.whitelistUrls.test && !this._globalOptions.whitelistUrls.test(fileurl)) {
return;
}
- var data = objectMerge$1(
- {
- // sentry.interfaces.Exception
- exception: {
- values: [
- {
- type: type,
- value: message,
- stacktrace: stacktrace
- }
- ]
- },
- transaction: fileurl
+ var data = objectMerge$1({
+ // sentry.interfaces.Exception
+ exception: {
+ values: [{
+ type: type,
+ value: message,
+ stacktrace: stacktrace
+ }]
},
- options
- );
-
+ transaction: fileurl
+ }, options);
var ex = data.exception.values[0];
+
if (ex.type == null && ex.value === '') {
ex.value = 'Unrecoverable error caught';
- }
-
- // Move mechanism from options to exception interface
+ } // Move mechanism from options to exception interface
// We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be
// too much
+
+
if (!data.exception.mechanism && data.mechanism) {
data.exception.mechanism = data.mechanism;
delete data.mechanism;
}
- data.exception.mechanism = objectMerge$1(
- {
- type: 'generic',
- handled: true
- },
- data.exception.mechanism || {}
- );
+ data.exception.mechanism = objectMerge$1({
+ type: 'generic',
+ handled: true
+ }, data.exception.mechanism || {}); // Fire away!
- // Fire away!
this._send(data);
},
-
- _trimPacket: function(data) {
+ _trimPacket: function _trimPacket(data) {
// For now, we only want to truncate the two different messages
// but this could/should be expanded to just trim everything
var max = this._globalOptions.maxMessageLength;
+
if (data.message) {
data.message = truncate$1(data.message, max);
}
+
if (data.exception) {
var exception = data.exception.values[0];
exception.value = truncate$1(exception.value, max);
}
var request = data.request;
+
if (request) {
if (request.url) {
request.url = truncate$1(request.url, this._globalOptions.maxUrlLength);
}
+
if (request.Referer) {
request.Referer = truncate$1(request.Referer, this._globalOptions.maxUrlLength);
}
}
- if (data.breadcrumbs && data.breadcrumbs.values)
- this._trimBreadcrumbs(data.breadcrumbs);
-
+ if (data.breadcrumbs && data.breadcrumbs.values) this._trimBreadcrumbs(data.breadcrumbs);
return data;
},
/**
* Truncate breadcrumb values (right now just URLs)
*/
- _trimBreadcrumbs: function(breadcrumbs) {
+ _trimBreadcrumbs: function _trimBreadcrumbs(breadcrumbs) {
// known breadcrumb properties with urls
// TODO: also consider arbitrary prop values that start with (https?)?://
var urlProps = ['to', 'from', 'url'],
- urlProp,
- crumb,
- data;
+ urlProp,
+ crumb,
+ data;
for (var i = 0; i < breadcrumbs.values.length; ++i) {
crumb = breadcrumbs.values[i];
- if (
- !crumb.hasOwnProperty('data') ||
- !isObject$1(crumb.data) ||
- objectFrozen$1(crumb.data)
- )
- continue;
-
+ if (!crumb.hasOwnProperty('data') || !isObject$1(crumb.data) || objectFrozen$1(crumb.data)) continue;
data = objectMerge$1({}, crumb.data);
+
for (var j = 0; j < urlProps.length; ++j) {
urlProp = urlProps[j];
+
if (data.hasOwnProperty(urlProp) && data[urlProp]) {
data[urlProp] = truncate$1(data[urlProp], this._globalOptions.maxUrlLength);
}
}
+
breadcrumbs.values[i].data = data;
}
},
-
- _getHttpData: function() {
+ _getHttpData: function _getHttpData() {
if (!this._hasNavigator && !this._hasDocument) return;
var httpData = {};
@@ -3607,9 +3524,9 @@ typeof navigator === "object" && (function () {
httpData.headers = {
'User-Agent': _navigator.userAgent
};
- }
+ } // Check in `window` instead of `document`, as we may be in ServiceWorker environment
+
- // Check in `window` instead of `document`, as we may be in ServiceWorker environment
if (_window$2.location && _window$2.location.href) {
httpData.url = _window$2.location.href;
}
@@ -3621,13 +3538,11 @@ typeof navigator === "object" && (function () {
return httpData;
},
-
- _resetBackoff: function() {
+ _resetBackoff: function _resetBackoff() {
this._backoffDuration = 0;
this._backoffStart = null;
},
-
- _shouldBackoff: function() {
+ _shouldBackoff: function _shouldBackoff() {
return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;
},
@@ -3640,17 +3555,12 @@ typeof navigator === "object" && (function () {
* other old browsers). This can take the form of an "exception"
* data object with a single frame (derived from the onerror args).
*/
- _isRepeatData: function(current) {
+ _isRepeatData: function _isRepeatData(current) {
var last = this._lastData;
+ if (!last || current.message !== last.message || // defined for captureMessage
+ current.transaction !== last.transaction // defined for captureException/onerror
+ ) return false; // Stacktrace interface (i.e. from captureMessage)
- if (
- !last ||
- current.message !== last.message || // defined for captureMessage
- current.transaction !== last.transaction // defined for captureException/onerror
- )
- return false;
-
- // Stacktrace interface (i.e. from captureMessage)
if (current.stacktrace || last.stacktrace) {
return isSameStacktrace$1(current.stacktrace, last.stacktrace);
} else if (current.exception || last.exception) {
@@ -3660,21 +3570,19 @@ typeof navigator === "object" && (function () {
return true;
},
-
- _setBackoffState: function(request) {
+ _setBackoffState: function _setBackoffState(request) {
// If we are already in a backoff state, don't change anything
if (this._shouldBackoff()) {
return;
}
- var status = request.status;
-
- // 400 - project_id doesn't exist or some other fatal
+ var status = request.status; // 400 - project_id doesn't exist or some other fatal
// 401 - invalid/revoked dsn
// 429 - too many requests
- if (!(status === 400 || status === 401 || status === 429)) return;
+ if (!(status === 400 || status === 401 || status === 429)) return;
var retry;
+
try {
// If Retry-After is not in Access-Control-Expose-Headers, most
// browsers will throw an exception trying to access it
@@ -3682,47 +3590,40 @@ typeof navigator === "object" && (function () {
retry = request.headers.get('Retry-After');
} else {
retry = request.getResponseHeader('Retry-After');
- }
+ } // Retry-After is returned in seconds
+
- // Retry-After is returned in seconds
retry = parseInt(retry, 10) * 1000;
} catch (e) {
/* eslint no-empty:0 */
}
- this._backoffDuration = retry
- ? // If Sentry server returned a Retry-After value, use it
- retry
- : // Otherwise, double the last backoff duration (starts at 1 sec)
- this._backoffDuration * 2 || 1000;
-
+ this._backoffDuration = retry ? // If Sentry server returned a Retry-After value, use it
+ retry : // Otherwise, double the last backoff duration (starts at 1 sec)
+ this._backoffDuration * 2 || 1000;
this._backoffStart = now();
},
-
- _send: function(data) {
+ _send: function _send(data) {
var globalOptions = this._globalOptions;
var baseData = {
- project: this._globalProject,
- logger: globalOptions.logger,
- platform: 'javascript'
- },
- httpData = this._getHttpData();
+ project: this._globalProject,
+ logger: globalOptions.logger,
+ platform: 'javascript'
+ },
+ httpData = this._getHttpData();
if (httpData) {
baseData.request = httpData;
- }
+ } // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload
- // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload
- if (data.trimHeadFrames) delete data.trimHeadFrames;
- data = objectMerge$1(baseData, data);
+ if (data.trimHeadFrames) delete data.trimHeadFrames;
+ data = objectMerge$1(baseData, data); // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge
- // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge
data.tags = objectMerge$1(objectMerge$1({}, this._globalContext.tags), data.tags);
- data.extra = objectMerge$1(objectMerge$1({}, this._globalContext.extra), data.extra);
+ data.extra = objectMerge$1(objectMerge$1({}, this._globalContext.extra), data.extra); // Send along our own collected metadata with extra
- // Send along our own collected metadata with extra
data.extra['session:duration'] = now() - this._startTime;
if (this._breadcrumbs && this._breadcrumbs.length > 0) {
@@ -3736,21 +3637,17 @@ typeof navigator === "object" && (function () {
if (this._globalContext.user) {
// sentry.interfaces.User
data.user = this._globalContext.user;
- }
+ } // Include the environment if it's defined in globalOptions
- // Include the environment if it's defined in globalOptions
- if (globalOptions.environment) data.environment = globalOptions.environment;
- // Include the release if it's defined in globalOptions
- if (globalOptions.release) data.release = globalOptions.release;
+ if (globalOptions.environment) data.environment = globalOptions.environment; // Include the release if it's defined in globalOptions
- // Include server_name if it's defined in globalOptions
- if (globalOptions.serverName) data.server_name = globalOptions.serverName;
+ if (globalOptions.release) data.release = globalOptions.release; // Include server_name if it's defined in globalOptions
- data = this._sanitizeData(data);
+ if (globalOptions.serverName) data.server_name = globalOptions.serverName;
+ data = this._sanitizeData(data); // Cleanup empty properties before sending them to the server
- // Cleanup empty properties before sending them to the server
- Object.keys(data).forEach(function(key) {
+ Object.keys(data).forEach(function (key) {
if (data[key] == null || data[key] === '' || isEmptyObject$1(data[key])) {
delete data[key];
}
@@ -3758,25 +3655,23 @@ typeof navigator === "object" && (function () {
if (isFunction$1(globalOptions.dataCallback)) {
data = globalOptions.dataCallback(data) || data;
- }
+ } // Why??????????
+
- // Why??????????
if (!data || isEmptyObject$1(data)) {
return;
- }
+ } // Check if the request should be filtered or not
- // Check if the request should be filtered or not
- if (
- isFunction$1(globalOptions.shouldSendCallback) &&
- !globalOptions.shouldSendCallback(data)
- ) {
- return;
- }
- // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),
+ if (isFunction$1(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) {
+ return;
+ } // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),
// so drop requests until "cool-off" period has elapsed.
+
+
if (this._shouldBackoff()) {
this._logDebug('warn', 'Raven dropped error due to backoff: ', data);
+
return;
}
@@ -3788,38 +3683,32 @@ typeof navigator === "object" && (function () {
this._sendProcessedPayload(data);
}
},
-
- _sanitizeData: function(data) {
+ _sanitizeData: function _sanitizeData(data) {
return sanitize$1(data, this._globalOptions.sanitizeKeys);
},
-
- _getUuid: function() {
+ _getUuid: function _getUuid() {
return uuid4$1();
},
-
- _sendProcessedPayload: function(data, callback) {
+ _sendProcessedPayload: function _sendProcessedPayload(data, callback) {
var self = this;
var globalOptions = this._globalOptions;
+ if (!this.isSetup()) return; // Try and clean up the packet before sending by truncating long values
- if (!this.isSetup()) return;
-
- // Try and clean up the packet before sending by truncating long values
- data = this._trimPacket(data);
-
- // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,
+ data = this._trimPacket(data); // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,
// but this would require copying an un-truncated copy of the data packet, which can be
// arbitrarily deep (extra_data) -- could be worthwhile? will revisit
+
if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {
this._logDebug('warn', 'Raven dropped repeat event: ', data);
- return;
- }
- // Send along an event_id if not explicitly passed.
+ return;
+ } // Send along an event_id if not explicitly passed.
// This event_id can be used to reference the error within Sentry itself.
// Set lastEventId after we know the error should actually be sent
- this._lastEventId = data.event_id || (data.event_id = this._getUuid());
- // Store outbound payload after trim
+
+ this._lastEventId = data.event_id || (data.event_id = this._getUuid()); // Store outbound payload after trim
+
this._lastData = data;
this._logDebug('debug', 'Raven about to send:', data);
@@ -3834,24 +3723,20 @@ typeof navigator === "object" && (function () {
auth.sentry_secret = this._globalSecret;
}
- var exception = data.exception && data.exception.values[0];
+ var exception = data.exception && data.exception.values[0]; // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy
- // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy
- if (
- this._globalOptions.autoBreadcrumbs &&
- this._globalOptions.autoBreadcrumbs.sentry
- ) {
+ if (this._globalOptions.autoBreadcrumbs && this._globalOptions.autoBreadcrumbs.sentry) {
this.captureBreadcrumb({
category: 'sentry',
- message: exception
- ? (exception.type ? exception.type + ': ' : '') + exception.value
- : data.message,
+ message: exception ? (exception.type ? exception.type + ': ' : '') + exception.value : data.message,
event_id: data.event_id,
level: data.level || 'error' // presume error unless specified
+
});
}
var url = this._globalEndpoint;
+
(globalOptions.transport || this._makeRequest).call(this, {
url: url,
auth: auth,
@@ -3864,6 +3749,7 @@ typeof navigator === "object" && (function () {
data: data,
src: url
});
+
callback && callback();
},
onError: function failure(error) {
@@ -3877,16 +3763,15 @@ typeof navigator === "object" && (function () {
data: data,
src: url
});
+
error = error || new Error('Raven send failed (no additional details provided)');
callback && callback(error);
}
});
},
-
- _makeRequest: function(opts) {
+ _makeRequest: function _makeRequest(opts) {
// Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests
var url = opts.url + '?' + urlencode$1(opts.auth);
-
var evaluatedHeaders = null;
var evaluatedFetchParameters = {};
@@ -3900,7 +3785,6 @@ typeof navigator === "object" && (function () {
if (supportsFetch$1()) {
evaluatedFetchParameters.body = stringify_1(opts.data);
-
var defaultFetchOptions = objectMerge$1({}, this._fetchDefaults);
var fetchOptions = objectMerge$1(defaultFetchOptions, evaluatedFetchParameters);
@@ -3908,35 +3792,29 @@ typeof navigator === "object" && (function () {
fetchOptions.headers = evaluatedHeaders;
}
- return _window$2
- .fetch(url, fetchOptions)
- .then(function(response) {
- if (response.ok) {
- opts.onSuccess && opts.onSuccess();
- } else {
- var error = new Error('Sentry error code: ' + response.status);
- // It's called request only to keep compatibility with XHR interface
- // and not add more redundant checks in setBackoffState method
- error.request = response;
- opts.onError && opts.onError(error);
- }
- })
- ['catch'](function() {
- opts.onError &&
- opts.onError(new Error('Sentry error code: network unavailable'));
- });
+ return _window$2.fetch(url, fetchOptions).then(function (response) {
+ if (response.ok) {
+ opts.onSuccess && opts.onSuccess();
+ } else {
+ var error = new Error('Sentry error code: ' + response.status); // It's called request only to keep compatibility with XHR interface
+ // and not add more redundant checks in setBackoffState method
+
+ error.request = response;
+ opts.onError && opts.onError(error);
+ }
+ })['catch'](function () {
+ opts.onError && opts.onError(new Error('Sentry error code: network unavailable'));
+ });
}
var request = _window$2.XMLHttpRequest && new _window$2.XMLHttpRequest();
- if (!request) return;
+ if (!request) return; // if browser doesn't support CORS (e.g. IE7), we are out of luck
- // if browser doesn't support CORS (e.g. IE7), we are out of luck
var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';
-
if (!hasCORS) return;
if ('withCredentials' in request) {
- request.onreadystatechange = function() {
+ request.onreadystatechange = function () {
if (request.readyState !== 4) {
return;
} else if (request.status === 200) {
@@ -3948,17 +3826,17 @@ typeof navigator === "object" && (function () {
}
};
} else {
- request = new XDomainRequest();
- // xdomainrequest cannot go http -> https (or vice versa),
+ request = new XDomainRequest(); // xdomainrequest cannot go http -> https (or vice versa),
// so always use protocol relative
- url = url.replace(/^https?:/, '');
- // onreadystatechange not supported by XDomainRequest
+ url = url.replace(/^https?:/, ''); // onreadystatechange not supported by XDomainRequest
+
if (opts.onSuccess) {
request.onload = opts.onSuccess;
}
+
if (opts.onError) {
- request.onerror = function() {
+ request.onerror = function () {
var err = new Error('Sentry error code: XDomainRequest');
err.request = request;
opts.onError(err);
@@ -3969,15 +3847,14 @@ typeof navigator === "object" && (function () {
request.open('POST', url);
if (evaluatedHeaders) {
- each$1(evaluatedHeaders, function(key, value) {
+ each$1(evaluatedHeaders, function (key, value) {
request.setRequestHeader(key, value);
});
}
request.send(stringify_1(opts.data));
},
-
- _evaluateHash: function(hash) {
+ _evaluateHash: function _evaluateHash(hash) {
var evaluated = {};
for (var key in hash) {
@@ -3989,35 +3866,24 @@ typeof navigator === "object" && (function () {
return evaluated;
},
-
- _logDebug: function(level) {
+ _logDebug: function _logDebug(level) {
// We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change
- if (
- this._originalConsoleMethods[level] &&
- (this.debug || this._globalOptions.debug)
- ) {
+ if (this._originalConsoleMethods[level] && (this.debug || this._globalOptions.debug)) {
// In IE<10 console methods do not have their own 'apply' method
- Function.prototype.apply.call(
- this._originalConsoleMethods[level],
- this._originalConsole,
- [].slice.call(arguments, 1)
- );
+ Function.prototype.apply.call(this._originalConsoleMethods[level], this._originalConsole, [].slice.call(arguments, 1));
}
},
-
- _mergeContext: function(key, context) {
+ _mergeContext: function _mergeContext(key, context) {
if (isUndefined$1(context)) {
delete this._globalContext[key];
} else {
this._globalContext[key] = objectMerge$1(this._globalContext[key] || {}, context);
}
}
- };
+ }; // Deprecations
- // Deprecations
Raven.prototype.setUser = Raven.prototype.setUserContext;
Raven.prototype.setReleaseContext = Raven.prototype.setRelease;
-
var raven = Raven;
/**
@@ -4025,33 +3891,26 @@ typeof navigator === "object" && (function () {
* main entry point for Raven. If you are a consumer of the
* Raven library, you SHOULD load this file (vs raven.js).
**/
+ // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
+ var _window$3 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
-
- // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
- var _window$3 =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
var _Raven = _window$3.Raven;
-
var Raven$1 = new raven();
-
/*
* Allow multiple versions of Raven to be installed.
* Strip Raven from the global context and returns the instance.
*
* @return {Raven}
*/
- Raven$1.noConflict = function() {
+
+ Raven$1.noConflict = function () {
_window$3.Raven = _Raven;
return Raven$1;
};
Raven$1.afterLoad();
-
var singleton = Raven$1;
-
/**
* DISCLAIMER:
*
@@ -4086,377 +3945,325 @@ typeof navigator === "object" && (function () {
*
* It should "just work".
*/
+
var Client = raven;
singleton.Client = Client;
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
+ var defaults = {
+ addCSS: true,
+ // Add CSS to the element to improve usability (required here or in your CSS!)
+ thumbWidth: 15,
+ // The width of the thumb handle
+ watch: true // Watch for new elements that match a string target
- function _defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
+ };
- function _createClass(Constructor, protoProps, staticProps) {
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
- if (staticProps) _defineProperties(Constructor, staticProps);
- return Constructor;
- }
+ // Element matches a selector
+ function matches(element, selector) {
- function _defineProperty(obj, key, value) {
- if (key in obj) {
- Object.defineProperty(obj, key, {
- value: value,
- enumerable: true,
- configurable: true,
- writable: true
- });
- } else {
- obj[key] = value;
+ function match() {
+ return Array.from(document.querySelectorAll(selector)).includes(this);
}
- return obj;
- }
-
- function _slicedToArray(arr, i) {
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
- }
-
- function _toConsumableArray(arr) {
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
+ var matches = match;
+ return matches.call(element, selector);
}
- function _arrayWithoutHoles(arr) {
- if (Array.isArray(arr)) {
- for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ // Trigger event
+ function trigger(element, type) {
+ if (!element || !type) {
+ return;
+ } // Create and dispatch the event
- return arr2;
- }
- }
- function _arrayWithHoles(arr) {
- if (Array.isArray(arr)) return arr;
- }
+ var event = new Event(type); // Dispatch the event
- function _iterableToArray(iter) {
- if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
+ element.dispatchEvent(event);
}
- function _iterableToArrayLimit(arr, i) {
- var _arr = [];
- var _n = true;
- var _d = false;
- var _e = undefined;
-
- try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
-
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"] != null) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
-
- return _arr;
- }
+ // ==========================================================================
+ // Type checking utils
+ // ==========================================================================
+ var getConstructor = function getConstructor(input) {
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
+ };
- function _nonIterableSpread() {
- throw new TypeError("Invalid attempt to spread non-iterable instance");
- }
+ var instanceOf = function instanceOf(input, constructor) {
+ return Boolean(input && constructor && input instanceof constructor);
+ };
- function _nonIterableRest() {
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
- }
+ var isNullOrUndefined = function isNullOrUndefined(input) {
+ return input === null || typeof input === 'undefined';
+ };
- const defaults = {
- addCSS: true, // Add CSS to the element to improve usability (required here or in your CSS!)
- thumbWidth: 15, // The width of the thumb handle
- watch: true, // Watch for new elements that match a string target
+ var isObject$2 = function isObject(input) {
+ return getConstructor(input) === Object;
};
- // Element matches a selector
- function matches(element, selector) {
+ var isNumber = function isNumber(input) {
+ return getConstructor(input) === Number && !Number.isNaN(input);
+ };
- function match() {
- return Array.from(document.querySelectorAll(selector)).includes(this);
- }
+ var isString$2 = function isString(input) {
+ return getConstructor(input) === String;
+ };
- const matches =
- match;
+ var isBoolean = function isBoolean(input) {
+ return getConstructor(input) === Boolean;
+ };
- return matches.call(element, selector);
- }
+ var isFunction$2 = function isFunction(input) {
+ return getConstructor(input) === Function;
+ };
- // Trigger event
- function trigger(element, type) {
- if (!element || !type) {
- return;
- }
+ var isArray$2 = function isArray(input) {
+ return Array.isArray(input);
+ };
- // Create and dispatch the event
- const event = new Event(type);
+ var isNodeList = function isNodeList(input) {
+ return instanceOf(input, NodeList);
+ };
- // Dispatch the event
- element.dispatchEvent(event);
- }
+ var isElement = function isElement(input) {
+ return instanceOf(input, Element);
+ };
- // ==========================================================================
- // Type checking utils
- // ==========================================================================
+ var isEvent = function isEvent(input) {
+ return instanceOf(input, Event);
+ };
- const getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);
- const instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);
-
- const isNullOrUndefined = input => input === null || typeof input === 'undefined';
- const isObject$2 = input => getConstructor(input) === Object;
- const isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);
- const isString$2 = input => getConstructor(input) === String;
- const isBoolean = input => getConstructor(input) === Boolean;
- const isFunction$2 = input => getConstructor(input) === Function;
- const isArray$2 = input => Array.isArray(input);
- const isNodeList = input => instanceOf(input, NodeList);
- const isElement = input => instanceOf(input, Element);
- const isEvent = input => instanceOf(input, Event);
- const isEmpty = input =>
- isNullOrUndefined(input) ||
- ((isString$2(input) || isArray$2(input) || isNodeList(input)) && !input.length) ||
- (isObject$2(input) && !Object.keys(input).length);
+ var isEmpty = function isEmpty(input) {
+ return isNullOrUndefined(input) || (isString$2(input) || isArray$2(input) || isNodeList(input)) && !input.length || isObject$2(input) && !Object.keys(input).length;
+ };
var is = {
- nullOrUndefined: isNullOrUndefined,
- object: isObject$2,
- number: isNumber,
- string: isString$2,
- boolean: isBoolean,
- function: isFunction$2,
- array: isArray$2,
- nodeList: isNodeList,
- element: isElement,
- event: isEvent,
- empty: isEmpty,
+ nullOrUndefined: isNullOrUndefined,
+ object: isObject$2,
+ number: isNumber,
+ string: isString$2,
+ boolean: isBoolean,
+ function: isFunction$2,
+ array: isArray$2,
+ nodeList: isNodeList,
+ element: isElement,
+ event: isEvent,
+ empty: isEmpty
};
// Get the number of decimal places
function getDecimalPlaces(value) {
- const match = `${value}`.match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
+ var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
- if (!match) {
- return 0;
- }
+ if (!match) {
+ return 0;
+ }
- return Math.max(
- 0,
- // Number of digits right of decimal point.
- (match[1] ? match[1].length : 0) -
- // Adjust for scientific notation.
- (match[2] ? +match[2] : 0),
- );
- }
+ return Math.max(0, // Number of digits right of decimal point.
+ (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.
+ match[2] ? +match[2] : 0));
+ } // Round to the nearest step
- // Round to the nearest step
function round(number, step) {
- if (step < 1) {
- const places = getDecimalPlaces(step);
- return parseFloat(number.toFixed(places));
- }
- return Math.round(number / step) * step;
+ if (step < 1) {
+ var places = getDecimalPlaces(step);
+ return parseFloat(number.toFixed(places));
+ }
+
+ return Math.round(number / step) * step;
}
- // ==========================================================================
+ var RangeTouch =
+ /*#__PURE__*/
+ function () {
+ /**
+ * Setup a new instance
+ * @param {String|Element} target
+ * @param {Object} options
+ */
+ function RangeTouch(target, options) {
+ _classCallCheck(this, RangeTouch);
- class RangeTouch {
- /**
- * Setup a new instance
- * @param {String|Element} target
- * @param {Object} options
- */
- constructor(target, options) {
- if (is.element(target)) {
- // An Element is passed, use it directly
- this.element = target;
- } else if (is.string(target)) {
- // A CSS Selector is passed, fetch it from the DOM
- this.element = document.querySelector(target);
- }
+ if (is.element(target)) {
+ // An Element is passed, use it directly
+ this.element = target;
+ } else if (is.string(target)) {
+ // A CSS Selector is passed, fetch it from the DOM
+ this.element = document.querySelector(target);
+ }
- if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {
- return;
- }
+ if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {
+ return;
+ }
- this.config = Object.assign({}, defaults, options);
+ this.config = Object.assign({}, defaults, options);
+ this.init();
+ }
- this.init();
+ _createClass(RangeTouch, [{
+ key: "init",
+ value: function init() {
+ // Bail if not a touch enabled device
+ if (!RangeTouch.enabled) {
+ return;
+ } // Add useful CSS
+
+
+ if (this.config.addCSS) {
+ // TODO: Restore original values on destroy
+ this.element.style.userSelect = 'none';
+ this.element.style.webKitUserSelect = 'none';
+ this.element.style.touchAction = 'manipulation';
+ }
+
+ this.listeners(true);
+ this.element.rangeTouch = this;
}
+ }, {
+ key: "destroy",
+ value: function destroy() {
+ // Bail if not a touch enabled device
+ if (!RangeTouch.enabled) {
+ return;
+ }
- static get enabled() {
- return 'ontouchstart' in document.documentElement;
+ this.listeners(false);
+ this.element.rangeTouch = null;
}
+ }, {
+ key: "listeners",
+ value: function listeners(toggle) {
+ var _this = this;
+ var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events
+
+ ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {
+ _this.element[method](type, function (event) {
+ return _this.set(event);
+ }, false);
+ });
+ }
/**
- * Setup multiple instances
- * @param {String|Element|NodeList|Array} target
- * @param {Object} options
+ * Get the value based on touch position
+ * @param {Event} event
*/
- static setup(target, options = {}) {
- let targets = null;
-
- if (is.empty(target) || is.string(target)) {
- targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]'));
- } else if (is.element(target)) {
- targets = [target];
- } else if (is.nodeList(target)) {
- targets = Array.from(target);
- } else if (is.array(target)) {
- targets = target.filter(is.element);
- }
- if (is.empty(targets)) {
- return null;
- }
+ }, {
+ key: "get",
+ value: function get(event) {
+ if (!RangeTouch.enabled || !is.event(event)) {
+ return null;
+ }
- const config = Object.assign({}, defaults, options);
-
- if (is.string(target) && config.watch) {
- // Create an observer instance
- const observer = new MutationObserver(mutations => {
- Array.from(mutations).forEach(mutation => {
- Array.from(mutation.addedNodes).forEach(node => {
- if (!is.element(node) || !matches(node, target)) {
- return;
- }
-
- // eslint-disable-next-line no-unused-vars
- const range = new RangeTouch(node, config);
- });
- });
- });
+ var input = event.target;
+ var touch = event.changedTouches[0];
+ var min = parseFloat(input.getAttribute('min')) || 0;
+ var max = parseFloat(input.getAttribute('max')) || 100;
+ var step = parseFloat(input.getAttribute('step')) || 1;
+ var delta = max - min; // Calculate percentage
- // Pass in the target node, as well as the observer options
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- });
- }
+ var percent;
+ var clientRect = input.getBoundingClientRect();
+ var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage
- return targets.map(t => new RangeTouch(t, options));
- }
+ percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds
- init() {
- // Bail if not a touch enabled device
- if (!RangeTouch.enabled) {
- return;
- }
+ if (percent < 0) {
+ percent = 0;
+ } else if (percent > 100) {
+ percent = 100;
+ } // Factor in the thumb offset
- // Add useful CSS
- if (this.config.addCSS) {
- // TODO: Restore original values on destroy
- this.element.style.userSelect = 'none';
- this.element.style.webKitUserSelect = 'none';
- this.element.style.touchAction = 'manipulation';
- }
- this.listeners(true);
+ if (percent < 50) {
+ percent -= (100 - percent * 2) * thumbWidth;
+ } else if (percent > 50) {
+ percent += (percent - 50) * 2 * thumbWidth;
+ } // Find the closest step to the mouse position
+
- this.element.rangeTouch = this;
+ return min + round(delta * (percent / 100), step);
}
+ /**
+ * Update range value based on position
+ * @param {Event} event
+ */
- destroy() {
- // Bail if not a touch enabled device
- if (!RangeTouch.enabled) {
- return;
- }
+ }, {
+ key: "set",
+ value: function set(event) {
+ if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {
+ return;
+ } // Prevent text highlight on iOS
- this.listeners(false);
- this.element.rangeTouch = null;
- }
+ event.preventDefault(); // Set value
- listeners(toggle) {
- const method = toggle ? 'addEventListener' : 'removeEventListener';
+ event.target.value = this.get(event); // Trigger event
- // Listen for events
- ['touchstart', 'touchmove', 'touchend'].forEach(type => {
- this.element[method](type, event => this.set(event), false);
- });
+ trigger(event.target, event.type === 'touchend' ? 'change' : 'input');
}
+ }], [{
+ key: "setup",
/**
- * Get the value based on touch position
- * @param {Event} event
+ * Setup multiple instances
+ * @param {String|Element|NodeList|Array} target
+ * @param {Object} options
*/
- get(event) {
- if (!RangeTouch.enabled || !is.event(event)) {
- return null;
- }
+ value: function setup(target) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var targets = null;
- const input = event.target;
- const touch = event.changedTouches[0];
- const min = parseFloat(input.getAttribute('min')) || 0;
- const max = parseFloat(input.getAttribute('max')) || 100;
- const step = parseFloat(input.getAttribute('step')) || 1;
- const delta = max - min;
-
- // Calculate percentage
- let percent;
- const clientRect = input.getBoundingClientRect();
- const thumbWidth = ((100 / clientRect.width) * (this.config.thumbWidth / 2)) / 100;
-
- // Determine left percentage
- percent = (100 / clientRect.width) * (touch.clientX - clientRect.left);
-
- // Don't allow outside bounds
- if (percent < 0) {
- percent = 0;
- } else if (percent > 100) {
- percent = 100;
- }
+ if (is.empty(target) || is.string(target)) {
+ targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]'));
+ } else if (is.element(target)) {
+ targets = [target];
+ } else if (is.nodeList(target)) {
+ targets = Array.from(target);
+ } else if (is.array(target)) {
+ targets = target.filter(is.element);
+ }
- // Factor in the thumb offset
- if (percent < 50) {
- percent -= (100 - percent * 2) * thumbWidth;
- } else if (percent > 50) {
- percent += (percent - 50) * 2 * thumbWidth;
- }
+ if (is.empty(targets)) {
+ return null;
+ }
- // Find the closest step to the mouse position
- return min + round(delta * (percent / 100), step);
- }
+ var config = Object.assign({}, defaults, options);
- /**
- * Update range value based on position
- * @param {Event} event
- */
- set(event) {
- if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {
- return;
- }
+ if (is.string(target) && config.watch) {
+ // Create an observer instance
+ var observer = new MutationObserver(function (mutations) {
+ Array.from(mutations).forEach(function (mutation) {
+ Array.from(mutation.addedNodes).forEach(function (node) {
+ if (!is.element(node) || !matches(node, target)) {
+ return;
+ } // eslint-disable-next-line no-unused-vars
- // Prevent text highlight on iOS
- event.preventDefault();
- // Set value
- event.target.value = this.get(event);
+ var range = new RangeTouch(node, config);
+ });
+ });
+ }); // Pass in the target node, as well as the observer options
- // Trigger event
- trigger(event.target, event.type === 'touchend' ? 'change' : 'input');
+ observer.observe(document.body, {
+ childList: true,
+ subtree: true
+ });
+ }
+
+ return targets.map(function (t) {
+ return new RangeTouch(t, options);
+ });
}
- }
+ }, {
+ key: "enabled",
+ get: function get() {
+ return 'ontouchstart' in document.documentElement;
+ }
+ }]);
+
+ return RangeTouch;
+ }();
// ==========================================================================
// Type checking utils
@@ -7116,8 +6923,8 @@ typeof navigator === "object" && (function () {
/**
* Parse a string to a URL object
- * @param {string} input - the URL to be parsed
- * @param {boolean} safe - failsafe parsing
+ * @param {String} input - the URL to be parsed
+ * @param {Boolean} safe - failsafe parsing
*/
function parseUrl$2(input) {
@@ -7564,7 +7371,7 @@ typeof navigator === "object" && (function () {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.5.0/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.5.1/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
// Quality default
@@ -9261,295 +9068,273 @@ typeof navigator === "object" && (function () {
}();
var loadjs_umd = createCommonjsModule(function (module, exports) {
- (function(root, factory) {
- {
- module.exports = factory();
- }
- }(commonjsGlobal, function() {
- /**
- * Global dependencies.
- * @global {Object} document - DOM
- */
+ (function (root, factory) {
+ {
+ module.exports = factory();
+ }
+ })(commonjsGlobal, function () {
+ /**
+ * Global dependencies.
+ * @global {Object} document - DOM
+ */
+ var devnull = function devnull() {},
+ bundleIdCache = {},
+ bundleResultCache = {},
+ bundleCallbackQueue = {};
+ /**
+ * Subscribe to bundle load event.
+ * @param {string[]} bundleIds - Bundle ids
+ * @param {Function} callbackFn - The callback function
+ */
- var devnull = function() {},
- bundleIdCache = {},
- bundleResultCache = {},
- bundleCallbackQueue = {};
+ function subscribe(bundleIds, callbackFn) {
+ // listify
+ bundleIds = bundleIds.push ? bundleIds : [bundleIds];
+ var depsNotFound = [],
+ i = bundleIds.length,
+ numWaiting = i,
+ fn,
+ bundleId,
+ r,
+ q; // define callback function
- /**
- * Subscribe to bundle load event.
- * @param {string[]} bundleIds - Bundle ids
- * @param {Function} callbackFn - The callback function
- */
- function subscribe(bundleIds, callbackFn) {
- // listify
- bundleIds = bundleIds.push ? bundleIds : [bundleIds];
-
- var depsNotFound = [],
- i = bundleIds.length,
- numWaiting = i,
- fn,
- bundleId,
- r,
- q;
-
- // define callback function
- fn = function (bundleId, pathsNotFound) {
- if (pathsNotFound.length) depsNotFound.push(bundleId);
-
- numWaiting--;
- if (!numWaiting) callbackFn(depsNotFound);
- };
+ fn = function fn(bundleId, pathsNotFound) {
+ if (pathsNotFound.length) depsNotFound.push(bundleId);
+ numWaiting--;
+ if (!numWaiting) callbackFn(depsNotFound);
+ }; // register callback
- // register callback
- while (i--) {
- bundleId = bundleIds[i];
- // execute callback if in result cache
- r = bundleResultCache[bundleId];
- if (r) {
- fn(bundleId, r);
- continue;
- }
+ while (i--) {
+ bundleId = bundleIds[i]; // execute callback if in result cache
- // add to callback queue
- q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
- q.push(fn);
- }
- }
+ r = bundleResultCache[bundleId];
+ if (r) {
+ fn(bundleId, r);
+ continue;
+ } // add to callback queue
- /**
- * Publish bundle load event.
- * @param {string} bundleId - Bundle id
- * @param {string[]} pathsNotFound - List of files not found
- */
- function publish(bundleId, pathsNotFound) {
- // exit if id isn't defined
- if (!bundleId) return;
- var q = bundleCallbackQueue[bundleId];
+ q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
+ q.push(fn);
+ }
+ }
+ /**
+ * Publish bundle load event.
+ * @param {string} bundleId - Bundle id
+ * @param {string[]} pathsNotFound - List of files not found
+ */
- // cache result
- bundleResultCache[bundleId] = pathsNotFound;
- // exit if queue is empty
- if (!q) return;
+ function publish(bundleId, pathsNotFound) {
+ // exit if id isn't defined
+ if (!bundleId) return;
+ var q = bundleCallbackQueue[bundleId]; // cache result
- // empty callback queue
- while (q.length) {
- q[0](bundleId, pathsNotFound);
- q.splice(0, 1);
- }
- }
+ bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty
+ if (!q) return; // empty callback queue
- /**
- * Execute callbacks.
- * @param {Object or Function} args - The callback args
- * @param {string[]} depsNotFound - List of dependencies not found
- */
- function executeCallbacks(args, depsNotFound) {
- // accept function as argument
- if (args.call) args = {success: args};
+ while (q.length) {
+ q[0](bundleId, pathsNotFound);
+ q.splice(0, 1);
+ }
+ }
+ /**
+ * Execute callbacks.
+ * @param {Object or Function} args - The callback args
+ * @param {string[]} depsNotFound - List of dependencies not found
+ */
- // success and error callbacks
- if (depsNotFound.length) (args.error || devnull)(depsNotFound);
- else (args.success || devnull)(args);
- }
+ function executeCallbacks(args, depsNotFound) {
+ // accept function as argument
+ if (args.call) args = {
+ success: args
+ }; // success and error callbacks
- /**
- * Load individual file.
- * @param {string} path - The file path
- * @param {Function} callbackFn - The callback function
- */
- function loadFile(path, callbackFn, args, numTries) {
- var doc = document,
- async = args.async,
- maxTries = (args.numRetries || 0) + 1,
- beforeCallbackFn = args.before || devnull,
- pathStripped = path.replace(/^(css|img)!/, ''),
- isCss,
- e;
-
- numTries = numTries || 0;
-
- if (/(^css!|\.css$)/.test(path)) {
- isCss = true;
-
- // css
- e = doc.createElement('link');
- e.rel = 'stylesheet';
- e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
- } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
- // image
- e = doc.createElement('img');
- e.src = pathStripped;
- } else {
- // javascript
- e = doc.createElement('script');
- e.src = path;
- e.async = async === undefined ? true : async;
- }
+ if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);
+ }
+ /**
+ * Load individual file.
+ * @param {string} path - The file path
+ * @param {Function} callbackFn - The callback function
+ */
- e.onload = e.onerror = e.onbeforeload = function (ev) {
- var result = ev.type[0];
- // Note: The following code isolates IE using `hideFocus` and treats empty
- // stylesheets as failures to get around lack of onerror support
- if (isCss && 'hideFocus' in e) {
- try {
- if (!e.sheet.cssText.length) result = 'e';
- } catch (x) {
- // sheets objects created from load errors don't allow access to
- // `cssText` (unless error is Code:18 SecurityError)
- if (x.code != 18) result = 'e';
+ function loadFile(path, callbackFn, args, numTries) {
+ var doc = document,
+ async = args.async,
+ maxTries = (args.numRetries || 0) + 1,
+ beforeCallbackFn = args.before || devnull,
+ pathStripped = path.replace(/^(css|img)!/, ''),
+ isCss,
+ e;
+ numTries = numTries || 0;
+
+ if (/(^css!|\.css$)/.test(path)) {
+ isCss = true; // css
+
+ e = doc.createElement('link');
+ e.rel = 'stylesheet';
+ e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
+ } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
+ // image
+ e = doc.createElement('img');
+ e.src = pathStripped;
+ } else {
+ // javascript
+ e = doc.createElement('script');
+ e.src = path;
+ e.async = async === undefined ? true : async;
}
- }
- // handle retries in case of load failure
- if (result == 'e') {
- // increment counter
- numTries += 1;
+ e.onload = e.onerror = e.onbeforeload = function (ev) {
+ var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty
+ // stylesheets as failures to get around lack of onerror support
- // exit function and try again
- if (numTries < maxTries) {
- return loadFile(path, callbackFn, args, numTries);
- }
- }
+ if (isCss && 'hideFocus' in e) {
+ try {
+ if (!e.sheet.cssText.length) result = 'e';
+ } catch (x) {
+ // sheets objects created from load errors don't allow access to
+ // `cssText` (unless error is Code:18 SecurityError)
+ if (x.code != 18) result = 'e';
+ }
+ } // handle retries in case of load failure
- // execute callback
- callbackFn(path, result, ev.defaultPrevented);
- };
- // add to document (unless callback returns `false`)
- if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
- }
+ if (result == 'e') {
+ // increment counter
+ numTries += 1; // exit function and try again
+
+ if (numTries < maxTries) {
+ return loadFile(path, callbackFn, args, numTries);
+ }
+ } // execute callback
- /**
- * Load multiple files.
- * @param {string[]} paths - The file paths
- * @param {Function} callbackFn - The callback function
- */
- function loadFiles(paths, callbackFn, args) {
- // listify paths
- paths = paths.push ? paths : [paths];
-
- var numWaiting = paths.length,
- x = numWaiting,
- pathsNotFound = [],
- fn,
- i;
+ callbackFn(path, result, ev.defaultPrevented);
+ }; // add to document (unless callback returns `false`)
- // define callback function
- fn = function(path, result, defaultPrevented) {
- // handle error
- if (result == 'e') pathsNotFound.push(path);
- // handle beforeload event. If defaultPrevented then that means the load
- // will be blocked (ex. Ghostery/ABP on Safari)
- if (result == 'b') {
- if (defaultPrevented) pathsNotFound.push(path);
- else return;
+ if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
}
+ /**
+ * Load multiple files.
+ * @param {string[]} paths - The file paths
+ * @param {Function} callbackFn - The callback function
+ */
- numWaiting--;
- if (!numWaiting) callbackFn(pathsNotFound);
- };
- // load scripts
- for (i=0; i < x; i++) loadFile(paths[i], fn, args);
- }
+ function loadFiles(paths, callbackFn, args) {
+ // listify paths
+ paths = paths.push ? paths : [paths];
+ var numWaiting = paths.length,
+ x = numWaiting,
+ pathsNotFound = [],
+ fn,
+ i; // define callback function
+ fn = function fn(path, result, defaultPrevented) {
+ // handle error
+ if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load
+ // will be blocked (ex. Ghostery/ABP on Safari)
- /**
- * Initiate script load and register bundle.
- * @param {(string|string[])} paths - The file paths
- * @param {(string|Function)} [arg1] - The bundleId or success callback
- * @param {Function} [arg2] - The success or error callback
- * @param {Function} [arg3] - The error callback
- */
- function loadjs(paths, arg1, arg2) {
- var bundleId,
- args;
+ if (result == 'b') {
+ if (defaultPrevented) pathsNotFound.push(path);else return;
+ }
- // bundleId (if string)
- if (arg1 && arg1.trim) bundleId = arg1;
+ numWaiting--;
+ if (!numWaiting) callbackFn(pathsNotFound);
+ }; // load scripts
- // args (default is {})
- args = (bundleId ? arg2 : arg1) || {};
- // throw error if bundle is already defined
- if (bundleId) {
- if (bundleId in bundleIdCache) {
- throw "LoadJS";
- } else {
- bundleIdCache[bundleId] = true;
+ for (i = 0; i < x; i++) {
+ loadFile(paths[i], fn, args);
+ }
}
- }
+ /**
+ * Initiate script load and register bundle.
+ * @param {(string|string[])} paths - The file paths
+ * @param {(string|Function)} [arg1] - The bundleId or success callback
+ * @param {Function} [arg2] - The success or error callback
+ * @param {Function} [arg3] - The error callback
+ */
- // load scripts
- loadFiles(paths, function (pathsNotFound) {
- // execute callbacks
- executeCallbacks(args, pathsNotFound);
- // publish bundle load event
- publish(bundleId, pathsNotFound);
- }, args);
- }
+ function loadjs(paths, arg1, arg2) {
+ var bundleId, args; // bundleId (if string)
+ if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})
- /**
- * Execute callbacks when dependencies have been satisfied.
- * @param {(string|string[])} deps - List of bundle ids
- * @param {Object} args - success/error arguments
- */
- loadjs.ready = function ready(deps, args) {
- // subscribe to bundle load event
- subscribe(deps, function (depsNotFound) {
- // execute callbacks
- executeCallbacks(args, depsNotFound);
- });
+ args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined
- return loadjs;
- };
+ if (bundleId) {
+ if (bundleId in bundleIdCache) {
+ throw "LoadJS";
+ } else {
+ bundleIdCache[bundleId] = true;
+ }
+ } // load scripts
- /**
- * Manually satisfy bundle dependencies.
- * @param {string} bundleId - The bundle id
- */
- loadjs.done = function done(bundleId) {
- publish(bundleId, []);
- };
+ loadFiles(paths, function (pathsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, pathsNotFound); // publish bundle load event
+ publish(bundleId, pathsNotFound);
+ }, args);
+ }
+ /**
+ * Execute callbacks when dependencies have been satisfied.
+ * @param {(string|string[])} deps - List of bundle ids
+ * @param {Object} args - success/error arguments
+ */
- /**
- * Reset loadjs dependencies statuses
- */
- loadjs.reset = function reset() {
- bundleIdCache = {};
- bundleResultCache = {};
- bundleCallbackQueue = {};
- };
+
+ loadjs.ready = function ready(deps, args) {
+ // subscribe to bundle load event
+ subscribe(deps, function (depsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, depsNotFound);
+ });
+ return loadjs;
+ };
+ /**
+ * Manually satisfy bundle dependencies.
+ * @param {string} bundleId - The bundle id
+ */
- /**
- * Determine if bundle has already been defined
- * @param String} bundleId - The bundle id
- */
- loadjs.isDefined = function isDefined(bundleId) {
- return bundleId in bundleIdCache;
- };
+ loadjs.done = function done(bundleId) {
+ publish(bundleId, []);
+ };
+ /**
+ * Reset loadjs dependencies statuses
+ */
- // export
- return loadjs;
+ loadjs.reset = function reset() {
+ bundleIdCache = {};
+ bundleResultCache = {};
+ bundleCallbackQueue = {};
+ };
+ /**
+ * Determine if bundle has already been defined
+ * @param String} bundleId - The bundle id
+ */
+
- }));
+ loadjs.isDefined = function isDefined(bundleId) {
+ return bundleId in bundleIdCache;
+ }; // export
+
+
+ return loadjs;
+ });
});
// ==========================================================================
@@ -10346,7 +10131,7 @@ typeof navigator === "object" && (function () {
function () {
/**
* Ads constructor.
- * @param {object} player
+ * @param {Object} player
* @return {Ads}
*/
function Ads(player) {
@@ -10493,7 +10278,7 @@ typeof navigator === "object" && (function () {
}
/**
* Update the ad countdown
- * @param {boolean} start
+ * @param {Boolean} start
*/
}, {
@@ -10861,7 +10646,7 @@ typeof navigator === "object" && (function () {
}
/**
* Handles callbacks after an ad event was invoked
- * @param {string} event - Event type
+ * @param {String} event - Event type
*/
}, {
@@ -10885,8 +10670,8 @@ typeof navigator === "object" && (function () {
}
/**
* Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
+ * @param {String} event - Event type
+ * @param {Function} callback - Callback for when event occurs
* @return {Ads}
*/
@@ -10905,8 +10690,8 @@ typeof navigator === "object" && (function () {
* The advertisement has 12 seconds to get its things together. We stop this timer when the
* advertisement is playing, or when a user action is required to start, then we clear the
* timer on ad ready
- * @param {number} time
- * @param {string} from
+ * @param {Number} time
+ * @param {String} from
*/
}, {
@@ -10923,7 +10708,7 @@ typeof navigator === "object" && (function () {
}
/**
* Clear our safety timer(s)
- * @param {string} from
+ * @param {String} from
*/
}, {
@@ -12083,7 +11868,7 @@ typeof navigator === "object" && (function () {
/**
* Toggle playback based on current status
- * @param {boolean} input
+ * @param {Boolean} input
*/
value: function togglePlay(input) {
// Toggle based on current state if nothing passed
@@ -12120,7 +11905,7 @@ typeof navigator === "object" && (function () {
}
/**
* Rewind
- * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
+ * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
*/
}, {
@@ -12130,7 +11915,7 @@ typeof navigator === "object" && (function () {
}
/**
* Fast forward
- * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
+ * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
*/
}, {
@@ -12140,7 +11925,7 @@ typeof navigator === "object" && (function () {
}
/**
* Seek to a time
- * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
*/
}, {
@@ -12148,7 +11933,7 @@ typeof navigator === "object" && (function () {
/**
* Increase volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
*/
value: function increaseVolume(step) {
var volume = this.media.muted ? 0 : this.volume;
@@ -12156,7 +11941,7 @@ typeof navigator === "object" && (function () {
}
/**
* Decrease volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
*/
}, {
@@ -12166,7 +11951,7 @@ typeof navigator === "object" && (function () {
}
/**
* Set muted state
- * @param {boolean} mute
+ * @param {Boolean} mute
*/
}, {
@@ -12174,14 +11959,14 @@ typeof navigator === "object" && (function () {
/**
* Toggle captions
- * @param {boolean} input - Whether to enable captions
+ * @param {Boolean} input - Whether to enable captions
*/
value: function toggleCaptions(input) {
captions.toggle.call(this, input, false);
}
/**
* Set the caption track by index
- * @param {number} - Caption index
+ * @param {Number} - Caption index
*/
}, {
@@ -12199,7 +11984,7 @@ typeof navigator === "object" && (function () {
}
/**
* Toggle the player controls
- * @param {boolean} [toggle] - Whether to show the controls
+ * @param {Boolean} [toggle] - Whether to show the controls
*/
}, {
@@ -12231,8 +12016,8 @@ typeof navigator === "object" && (function () {
}
/**
* Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
+ * @param {String} event - Event type
+ * @param {Function} callback - Callback for when event occurs
*/
}, {
@@ -12242,8 +12027,8 @@ typeof navigator === "object" && (function () {
}
/**
* Add event listeners once
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
+ * @param {String} event - Event type
+ * @param {Function} callback - Callback for when event occurs
*/
}, {
@@ -12253,8 +12038,8 @@ typeof navigator === "object" && (function () {
}
/**
* Remove event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
+ * @param {String} event - Event type
+ * @param {Function} callback - Callback for when event occurs
*/
}, {
@@ -12266,8 +12051,8 @@ typeof navigator === "object" && (function () {
* Destroy an instance
* Event listeners are removed when elements are removed
* http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
- * @param {function} callback - Callback for when destroy is complete
- * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
+ * @param {Function} callback - Callback for when destroy is complete
+ * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)
*/
}, {
@@ -12361,7 +12146,7 @@ typeof navigator === "object" && (function () {
}
/**
* Check for support for a mime type (HTML5 only)
- * @param {string} type - Mime type
+ * @param {String} type - Mime type
*/
}, {
@@ -12371,9 +12156,9 @@ typeof navigator === "object" && (function () {
}
/**
* Check for support
- * @param {string} type - Player type (audio/video)
- * @param {string} provider - Provider (html5/youtube/vimeo)
- * @param {bool} inline - Where player has `playsinline` sttribute
+ * @param {String} type - Player type (audio/video)
+ * @param {String} provider - Provider (html5/youtube/vimeo)
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
*/
}, {
@@ -12508,7 +12293,7 @@ typeof navigator === "object" && (function () {
}
/**
* Set the player volume
- * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
+ * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
*/
}, {
@@ -12605,7 +12390,7 @@ typeof navigator === "object" && (function () {
}
/**
* Set playback speed
- * @param {number} speed - the speed of playback (0.5-2.0)
+ * @param {Number} speed - the speed of playback (0.5-2.0)
*/
}, {
@@ -12654,7 +12439,7 @@ typeof navigator === "object" && (function () {
/**
* Set playback quality
* Currently HTML5 & YouTube only
- * @param {number} input - Quality level
+ * @param {Number} input - Quality level
*/
}, {
@@ -12699,7 +12484,7 @@ typeof navigator === "object" && (function () {
/**
* Toggle loop
* TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
- * @param {boolean} input - Whether to loop or not
+ * @param {Boolean} input - Whether to loop or not
*/
}, {
@@ -12755,7 +12540,7 @@ typeof navigator === "object" && (function () {
}
/**
* Set new media source
- * @param {object} input - The new source object (see docs)
+ * @param {Object} input - The new source object (see docs)
*/
}, {
@@ -12782,7 +12567,7 @@ typeof navigator === "object" && (function () {
}
/**
* Set the poster image for a video
- * @param {input} - the URL for the new poster image
+ * @param {String} input - the URL for the new poster image
*/
}, {
@@ -12808,7 +12593,7 @@ typeof navigator === "object" && (function () {
}
/**
* Set the autoplay state
- * @param {boolean} input - Whether to autoplay or not
+ * @param {Boolean} input - Whether to autoplay or not
*/
}, {
@@ -12842,7 +12627,7 @@ typeof navigator === "object" && (function () {
/**
* Set the wanted language for captions
* Since tracks can be added later it won't update the actual caption track until there is a matching track
- * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
+ * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)
*/
}, {
@@ -12912,8 +12697,8 @@ typeof navigator === "object" && (function () {
}
/**
* Load an SVG sprite into the page
- * @param {string} url - URL for the SVG sprite
- * @param {string} [id] - Unique ID
+ * @param {String} url - URL for the SVG sprite
+ * @param {String} [id] - Unique ID
*/
}, {
@@ -12924,7 +12709,7 @@ typeof navigator === "object" && (function () {
/**
* Setup multiple instances
* @param {*} selector
- * @param {object} options
+ * @param {Object} options
*/
}, {