diff --git a/client/GruntFile.js b/client/GruntFile.js index f5d8174f61a..223dfc3a8d1 100644 --- a/client/GruntFile.js +++ b/client/GruntFile.js @@ -70,12 +70,13 @@ module.exports = function(grunt) { "jquery": [ "dist/jquery.js", "jquery/jquery.js" ], "jquery-migrate-official": [ "index.js", "jquery/jquery.migrate.js" ], - // these need to be updated and tested - //"traceKit": [ "tracekit.js", "tracekit.js" ], + "traceKit": [ "tracekit.js", "tracekit.js" ], //"ravenjs": [ "dist/raven.js", "raven.js" ], - //"require": [ "build/require.js", "require.js" ], //"underscore": [ "underscore.js", "underscore.js" ], //"backbone": [ "backbone.js", "backbone/backbone.js" ], + + // these need to be updated and tested + //"require": [ "build/require.js", "require.js" ], //"d3": [ "d3.js", "d3.js" ], //"farbtastic": [ "src/farbtastic.js", "farbtastic.js" ], //"jQTouch": [ "src/reference/jqtouch.js", "jquery/jqtouch.js" ], diff --git a/client/galaxy/scripts/libs/tracekit.js b/client/galaxy/scripts/libs/tracekit.js index bf7d18bfd2b..cea78b3ffb4 100644 --- a/client/galaxy/scripts/libs/tracekit.js +++ b/client/galaxy/scripts/libs/tracekit.js @@ -3,12 +3,32 @@ MIT license */ -;(function(window, undefined) { +(function(window, undefined) { var TraceKit = {}; var _oldTraceKit = window.TraceKit; +// global reference to slice +var _slice = [].slice; +var UNKNOWN_FUNCTION = '?'; + + +/** + * _has, a better form of hasOwnProperty + * Example: _has(MainHostObject, property) === true/false + * + * @param {Object} host object to check property + * @param {string} key to check + */ +function _has(object, key) { + return Object.prototype.hasOwnProperty.call(object, key); +} + +function _isUndefined(what) { + return typeof what === 'undefined'; +} + /** * TraceKit.noConflict: Export TraceKit out to another variable * Example: var TK = TraceKit.noConflict() @@ -19,14 +39,22 @@ TraceKit.noConflict = function noConflict() { }; /** - * TraceKit._has, a better form of hasOwnProperty - * Example: TraceKit._has(MainHostObject, property) === true/false + * TraceKit.wrap: Wrap any function in a TraceKit reporter + * Example: func = TraceKit.wrap(func); * - * @param {Object} host object to check property - * @param {string} key to check + * @param {Function} func Function to be wrapped + * @return {Function} The wrapped func */ -TraceKit._has = function _has(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); +TraceKit.wrap = function traceKitWrapper(func) { + function wrapped() { + try { + return func.apply(this, arguments); + } catch (e) { + TraceKit.report(e); + throw e; + } + } + return wrapped; }; /** @@ -78,6 +106,7 @@ TraceKit.report = (function reportModuleWrapper() { * @param {Function} handler */ function subscribe(handler) { + installGlobalHandler(); handlers.push(handler); } @@ -103,9 +132,9 @@ TraceKit.report = (function reportModuleWrapper() { return; } for (var i in handlers) { - if (TraceKit._has(handlers, i)) { + if (_has(handlers, i)) { try { - handlers[i].apply(null, [stack].concat(Array.prototype.slice.call(arguments, 2))); + handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); } catch (inner) { exception = inner; } @@ -117,7 +146,7 @@ TraceKit.report = (function reportModuleWrapper() { } } - var _oldOnerrorHandler = window.onerror; + var _oldOnerrorHandler, _onErrorHandlerInstalled; /** * Ensures all global unhandled exceptions are recorded. @@ -127,7 +156,7 @@ TraceKit.report = (function reportModuleWrapper() { * @param {(number|string)} lineNo The line number at which the error * occurred. */ - window.onerror = function traceKitWindowOnError(message, url, lineNo) { + function traceKitWindowOnError(message, url, lineNo) { var stack = null; if (lastExceptionStack) { @@ -158,14 +187,24 @@ TraceKit.report = (function reportModuleWrapper() { } return false; - }; + } + + function installGlobalHandler () + { + if (_onErrorHandlerInstalled === true) { + return; + } + _oldOnerrorHandler = window.onerror; + window.onerror = traceKitWindowOnError; + _onErrorHandlerInstalled = true; + } /** * Reports an unhandled Error to TraceKit. * @param {Error} ex */ function report(ex) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _slice.call(arguments, 1); if (lastExceptionStack) { if (lastException === ex) { return; // already caught by an inner catch block, ignore @@ -283,29 +322,16 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { return ''; } try { - var XMLHttpRequestWrapper; + var getXHR = function() { + try { + return new window.XMLHttpRequest(); + } catch (e) { + // explicitly bubble up the exception if not found + return new window.ActiveXObject('Microsoft.XMLHTTP'); + } + }; - if (typeof (XMLHttpRequest) === 'undefined') { // IE 5.x-6.x: - XMLHttpRequestWrapper = function IEXMLHttpRequestSub() { - try { - return new ActiveXObject('Msxml2.XMLHTTP.6.0'); - } catch (e) {} - try { - return new ActiveXObject('Msxml2.XMLHTTP.3.0'); - } catch (e) {} - try { - return new ActiveXObject('Msxml2.XMLHTTP'); - } catch (e) {} - try { - return new ActiveXObject('Microsoft.XMLHTTP'); - } catch (e) {} - throw new Error('No XHR.'); - }; - } else { - XMLHttpRequestWrapper = XMLHttpRequest; - } - - var request = new XMLHttpRequestWrapper(); + var request = getXHR(); request.open('GET', url, false); request.send(''); return request.responseText; @@ -320,16 +346,14 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { * @return {Array.} Source contents. */ function getSource(url) { - if (!TraceKit._has(sourceCache, url)) { + if (!_has(sourceCache, url)) { // URL needs to be able to fetched within the acceptable domain. Otherwise, // cross-domain errors will be triggered. - var source; + var source = ''; if (url.indexOf(document.domain) !== -1) { source = loadSource(url); - } else { - source = []; } - sourceCache[url] = source.length ? source.split('\n') : []; + sourceCache[url] = source ? source.split('\n') : []; } return sourceCache[url]; @@ -352,7 +376,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { m; if (!source.length) { - return '?'; + return UNKNOWN_FUNCTION; } // Walk backwards from the first line in the function until we find the line which @@ -360,7 +384,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { for (var i = 0; i < maxLines; ++i) { line = source[lineNo - i] + line; - if (line !== undefined) { + if (!_isUndefined(line)) { if ((m = reGuessFunction.exec(line))) { return m[1]; } else if ((m = reFunctionArgNames.exec(line))) { @@ -369,7 +393,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { } } - return '?'; + return UNKNOWN_FUNCTION; } /** @@ -399,7 +423,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { line -= 1; // convert to 0-based index for (var i = start; i < end; ++i) { - if (typeof (source[i]) !== 'undefined') { + if (!_isUndefined(source[i])) { context.push(source[i]); } } @@ -594,7 +618,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { return null; } - var chrome = /^\s*at (?:((?:\[object object\])?\S+) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, + var chrome = /^\s*at (?:((?:\[object object\])?\S+(?: \[as \S+\])?) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, gecko = /^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i, lines = ex.stack.split('\n'), stack = [], @@ -606,7 +630,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { if ((parts = gecko.exec(lines[i]))) { element = { 'url': parts[3], - 'func': parts[1] || '?', + 'func': parts[1] || UNKNOWN_FUNCTION, 'args': parts[2] ? parts[2].split(',') : '', 'line': +parts[4], 'column': parts[5] ? +parts[5] : null @@ -614,7 +638,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { } else if ((parts = chrome.exec(lines[i]))) { element = { 'url': parts[2], - 'func': parts[1] || '?', + 'func': parts[1] || UNKNOWN_FUNCTION, 'line': +parts[3], 'column': parts[4] ? +parts[4] : null }; @@ -750,7 +774,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { source; for (i in scripts) { - if (TraceKit._has(scripts, i) && !scripts[i].src) { + if (_has(scripts, i) && !scripts[i].src) { inlineScriptBlocks.push(scripts[i]); } } @@ -904,7 +928,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { item = { 'url': null, - 'func': '?', + 'func': UNKNOWN_FUNCTION, 'line': null, 'column': null }; @@ -919,7 +943,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { item.url = source.url; item.line = source.line; - if (item.func === '?') { + if (item.func === UNKNOWN_FUNCTION) { item.func = guessFunctionName(item.url, item.line); } @@ -1029,8 +1053,6 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { } catch (ex) { return computeStackTrace(ex, depth + 1); } - - return null; } computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; @@ -1045,22 +1067,15 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { * Extends support for global error handling for asynchronous browser * functions. Adopted from Closure Library's errorhandler.js */ -(function extendToAsynchronousCallbacks(w) { +(function extendToAsynchronousCallbacks() { var _helper = function _helper(fnName) { - var originalFn = w[fnName]; - w[fnName] = function traceKitAsyncExtension() { + var originalFn = window[fnName]; + window[fnName] = function traceKitAsyncExtension() { // Make a copy of the arguments - var args = Array.prototype.slice.call(arguments, 0); + var args = _slice.call(arguments); var originalCallback = args[0]; if (typeof (originalCallback) === 'function') { - args[0] = function traceKitArgsZero() { - try { - originalCallback.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; + args[0] = TraceKit.wrap(originalCallback); } // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it // also only supports 2 argument and doesn't care what "this" is, so we @@ -1075,120 +1090,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { _helper('setTimeout'); _helper('setInterval'); -}(window)); - -/** - * Extended support for backtraces and global error handling for most - * asynchronous jQuery functions. - */ -(function traceKitAsyncForjQuery($) { - - // quit if jQuery isn't on the page - if (!$) { - return; - } - - var _oldEventAdd = $.event.add; - $.event.add = function traceKitEventAdd(elem, types, handler, data, selector) { - var _handler; - - if (handler.handler) { - _handler = handler.handler; - handler.handler = function traceKitHandler() { - try { - return _handler.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } else { - _handler = handler; - handler = function apply_handler() { - try { - return _handler.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - // If the handler we are attaching doesn’t have the same guid as - // the original, it will never be removed when someone tries to - // unbind the original function later. Technically as a result of - // this our guids are no longer globally unique, but whatever, that - // never hurt anybody RIGHT?! - if (_handler.guid) { - handler.guid = _handler.guid; - } else { - handler.guid = _handler.guid = $.guid++; - } - - return _oldEventAdd.call(this, elem, types, handler, data, selector); - }; - - var _oldReady = $.fn.ready; - $.fn.ready = function traceKitjQueryReadyWrapper(fn) { - var _fn = function () { - try { - return fn.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - - return _oldReady.call(this, _fn); - }; - - var _oldAjax = $.ajax; - $.ajax = function traceKitAjaxWrapper(s) { - if ($.isFunction(s.complete)) { - var _oldComplete = s.complete; - s.complete = function traceKitjQueryComplete() { - try { - return _oldComplete.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - if ($.isFunction(s.error)) { - var _oldError = s.error; - s.error = function traceKitjQueryError() { - try { - return _oldError.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - if ($.isFunction(s.success)) { - var _oldSuccess = s.success; - s.success = function traceKitjQuerySuccess() { - try { - return _oldSuccess.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - try { - return _oldAjax.call(this, s); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - -}(window.jQuery)); +}()); //Default options: if (!TraceKit.remoteFetching) { diff --git a/static/scripts/libs/tracekit.js b/static/scripts/libs/tracekit.js index bf7d18bfd2b..cea78b3ffb4 100644 --- a/static/scripts/libs/tracekit.js +++ b/static/scripts/libs/tracekit.js @@ -3,12 +3,32 @@ MIT license */ -;(function(window, undefined) { +(function(window, undefined) { var TraceKit = {}; var _oldTraceKit = window.TraceKit; +// global reference to slice +var _slice = [].slice; +var UNKNOWN_FUNCTION = '?'; + + +/** + * _has, a better form of hasOwnProperty + * Example: _has(MainHostObject, property) === true/false + * + * @param {Object} host object to check property + * @param {string} key to check + */ +function _has(object, key) { + return Object.prototype.hasOwnProperty.call(object, key); +} + +function _isUndefined(what) { + return typeof what === 'undefined'; +} + /** * TraceKit.noConflict: Export TraceKit out to another variable * Example: var TK = TraceKit.noConflict() @@ -19,14 +39,22 @@ TraceKit.noConflict = function noConflict() { }; /** - * TraceKit._has, a better form of hasOwnProperty - * Example: TraceKit._has(MainHostObject, property) === true/false + * TraceKit.wrap: Wrap any function in a TraceKit reporter + * Example: func = TraceKit.wrap(func); * - * @param {Object} host object to check property - * @param {string} key to check + * @param {Function} func Function to be wrapped + * @return {Function} The wrapped func */ -TraceKit._has = function _has(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); +TraceKit.wrap = function traceKitWrapper(func) { + function wrapped() { + try { + return func.apply(this, arguments); + } catch (e) { + TraceKit.report(e); + throw e; + } + } + return wrapped; }; /** @@ -78,6 +106,7 @@ TraceKit.report = (function reportModuleWrapper() { * @param {Function} handler */ function subscribe(handler) { + installGlobalHandler(); handlers.push(handler); } @@ -103,9 +132,9 @@ TraceKit.report = (function reportModuleWrapper() { return; } for (var i in handlers) { - if (TraceKit._has(handlers, i)) { + if (_has(handlers, i)) { try { - handlers[i].apply(null, [stack].concat(Array.prototype.slice.call(arguments, 2))); + handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); } catch (inner) { exception = inner; } @@ -117,7 +146,7 @@ TraceKit.report = (function reportModuleWrapper() { } } - var _oldOnerrorHandler = window.onerror; + var _oldOnerrorHandler, _onErrorHandlerInstalled; /** * Ensures all global unhandled exceptions are recorded. @@ -127,7 +156,7 @@ TraceKit.report = (function reportModuleWrapper() { * @param {(number|string)} lineNo The line number at which the error * occurred. */ - window.onerror = function traceKitWindowOnError(message, url, lineNo) { + function traceKitWindowOnError(message, url, lineNo) { var stack = null; if (lastExceptionStack) { @@ -158,14 +187,24 @@ TraceKit.report = (function reportModuleWrapper() { } return false; - }; + } + + function installGlobalHandler () + { + if (_onErrorHandlerInstalled === true) { + return; + } + _oldOnerrorHandler = window.onerror; + window.onerror = traceKitWindowOnError; + _onErrorHandlerInstalled = true; + } /** * Reports an unhandled Error to TraceKit. * @param {Error} ex */ function report(ex) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _slice.call(arguments, 1); if (lastExceptionStack) { if (lastException === ex) { return; // already caught by an inner catch block, ignore @@ -283,29 +322,16 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { return ''; } try { - var XMLHttpRequestWrapper; + var getXHR = function() { + try { + return new window.XMLHttpRequest(); + } catch (e) { + // explicitly bubble up the exception if not found + return new window.ActiveXObject('Microsoft.XMLHTTP'); + } + }; - if (typeof (XMLHttpRequest) === 'undefined') { // IE 5.x-6.x: - XMLHttpRequestWrapper = function IEXMLHttpRequestSub() { - try { - return new ActiveXObject('Msxml2.XMLHTTP.6.0'); - } catch (e) {} - try { - return new ActiveXObject('Msxml2.XMLHTTP.3.0'); - } catch (e) {} - try { - return new ActiveXObject('Msxml2.XMLHTTP'); - } catch (e) {} - try { - return new ActiveXObject('Microsoft.XMLHTTP'); - } catch (e) {} - throw new Error('No XHR.'); - }; - } else { - XMLHttpRequestWrapper = XMLHttpRequest; - } - - var request = new XMLHttpRequestWrapper(); + var request = getXHR(); request.open('GET', url, false); request.send(''); return request.responseText; @@ -320,16 +346,14 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { * @return {Array.} Source contents. */ function getSource(url) { - if (!TraceKit._has(sourceCache, url)) { + if (!_has(sourceCache, url)) { // URL needs to be able to fetched within the acceptable domain. Otherwise, // cross-domain errors will be triggered. - var source; + var source = ''; if (url.indexOf(document.domain) !== -1) { source = loadSource(url); - } else { - source = []; } - sourceCache[url] = source.length ? source.split('\n') : []; + sourceCache[url] = source ? source.split('\n') : []; } return sourceCache[url]; @@ -352,7 +376,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { m; if (!source.length) { - return '?'; + return UNKNOWN_FUNCTION; } // Walk backwards from the first line in the function until we find the line which @@ -360,7 +384,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { for (var i = 0; i < maxLines; ++i) { line = source[lineNo - i] + line; - if (line !== undefined) { + if (!_isUndefined(line)) { if ((m = reGuessFunction.exec(line))) { return m[1]; } else if ((m = reFunctionArgNames.exec(line))) { @@ -369,7 +393,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { } } - return '?'; + return UNKNOWN_FUNCTION; } /** @@ -399,7 +423,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { line -= 1; // convert to 0-based index for (var i = start; i < end; ++i) { - if (typeof (source[i]) !== 'undefined') { + if (!_isUndefined(source[i])) { context.push(source[i]); } } @@ -594,7 +618,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { return null; } - var chrome = /^\s*at (?:((?:\[object object\])?\S+) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, + var chrome = /^\s*at (?:((?:\[object object\])?\S+(?: \[as \S+\])?) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, gecko = /^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i, lines = ex.stack.split('\n'), stack = [], @@ -606,7 +630,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { if ((parts = gecko.exec(lines[i]))) { element = { 'url': parts[3], - 'func': parts[1] || '?', + 'func': parts[1] || UNKNOWN_FUNCTION, 'args': parts[2] ? parts[2].split(',') : '', 'line': +parts[4], 'column': parts[5] ? +parts[5] : null @@ -614,7 +638,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { } else if ((parts = chrome.exec(lines[i]))) { element = { 'url': parts[2], - 'func': parts[1] || '?', + 'func': parts[1] || UNKNOWN_FUNCTION, 'line': +parts[3], 'column': parts[4] ? +parts[4] : null }; @@ -750,7 +774,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { source; for (i in scripts) { - if (TraceKit._has(scripts, i) && !scripts[i].src) { + if (_has(scripts, i) && !scripts[i].src) { inlineScriptBlocks.push(scripts[i]); } } @@ -904,7 +928,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { item = { 'url': null, - 'func': '?', + 'func': UNKNOWN_FUNCTION, 'line': null, 'column': null }; @@ -919,7 +943,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { item.url = source.url; item.line = source.line; - if (item.func === '?') { + if (item.func === UNKNOWN_FUNCTION) { item.func = guessFunctionName(item.url, item.line); } @@ -1029,8 +1053,6 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { } catch (ex) { return computeStackTrace(ex, depth + 1); } - - return null; } computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; @@ -1045,22 +1067,15 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { * Extends support for global error handling for asynchronous browser * functions. Adopted from Closure Library's errorhandler.js */ -(function extendToAsynchronousCallbacks(w) { +(function extendToAsynchronousCallbacks() { var _helper = function _helper(fnName) { - var originalFn = w[fnName]; - w[fnName] = function traceKitAsyncExtension() { + var originalFn = window[fnName]; + window[fnName] = function traceKitAsyncExtension() { // Make a copy of the arguments - var args = Array.prototype.slice.call(arguments, 0); + var args = _slice.call(arguments); var originalCallback = args[0]; if (typeof (originalCallback) === 'function') { - args[0] = function traceKitArgsZero() { - try { - originalCallback.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; + args[0] = TraceKit.wrap(originalCallback); } // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it // also only supports 2 argument and doesn't care what "this" is, so we @@ -1075,120 +1090,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { _helper('setTimeout'); _helper('setInterval'); -}(window)); - -/** - * Extended support for backtraces and global error handling for most - * asynchronous jQuery functions. - */ -(function traceKitAsyncForjQuery($) { - - // quit if jQuery isn't on the page - if (!$) { - return; - } - - var _oldEventAdd = $.event.add; - $.event.add = function traceKitEventAdd(elem, types, handler, data, selector) { - var _handler; - - if (handler.handler) { - _handler = handler.handler; - handler.handler = function traceKitHandler() { - try { - return _handler.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } else { - _handler = handler; - handler = function apply_handler() { - try { - return _handler.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - // If the handler we are attaching doesn’t have the same guid as - // the original, it will never be removed when someone tries to - // unbind the original function later. Technically as a result of - // this our guids are no longer globally unique, but whatever, that - // never hurt anybody RIGHT?! - if (_handler.guid) { - handler.guid = _handler.guid; - } else { - handler.guid = _handler.guid = $.guid++; - } - - return _oldEventAdd.call(this, elem, types, handler, data, selector); - }; - - var _oldReady = $.fn.ready; - $.fn.ready = function traceKitjQueryReadyWrapper(fn) { - var _fn = function () { - try { - return fn.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - - return _oldReady.call(this, _fn); - }; - - var _oldAjax = $.ajax; - $.ajax = function traceKitAjaxWrapper(s) { - if ($.isFunction(s.complete)) { - var _oldComplete = s.complete; - s.complete = function traceKitjQueryComplete() { - try { - return _oldComplete.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - if ($.isFunction(s.error)) { - var _oldError = s.error; - s.error = function traceKitjQueryError() { - try { - return _oldError.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - if ($.isFunction(s.success)) { - var _oldSuccess = s.success; - s.success = function traceKitjQuerySuccess() { - try { - return _oldSuccess.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - } - - try { - return _oldAjax.call(this, s); - } catch (e) { - TraceKit.report(e); - throw e; - } - }; - -}(window.jQuery)); +}()); //Default options: if (!TraceKit.remoteFetching) { diff --git a/static/scripts/packed/libs/tracekit.js b/static/scripts/packed/libs/tracekit.js index a5fc27670a5..27f42b7dcab 100644 --- a/static/scripts/packed/libs/tracekit.js +++ b/static/scripts/packed/libs/tracekit.js @@ -1 +1 @@ -(function(h,d){var e={};var j=h.TraceKit;e.noConflict=function g(){h.TraceKit=j;return e};e._has=function a(k,l){return Object.prototype.hasOwnProperty.call(k,l)};e.report=(function i(){var k=[],o=null,q=null;function l(t){k.push(t)}function r(u){for(var t=k.length-1;t>=0;--t){if(k[t]===u){k.splice(t,1)}}}function p(t,v){var x=null;if(v&&!e.collectWindowErrors){return}for(var w in k){if(e._has(k,w)){try{k[w].apply(null,[t].concat(Array.prototype.slice.call(arguments,2)))}catch(u){x=u}}}if(x){throw x}}var s=h.onerror;h.onerror=function n(w,v,x){var t=null;if(q){e.computeStackTrace.augmentStackTraceWithInitialElement(q,v,x,w);t=q;q=null;o=null}else{var u={url:v,line:x};u.func=e.computeStackTrace.guessFunctionName(u.url,u.line);u.context=e.computeStackTrace.gatherContext(u.url,u.line);t={mode:"onerror",message:w,url:document.location.href,stack:[u],useragent:navigator.userAgent}}p(t,"from window.onerror");if(s){return s.apply(this,arguments)}return false};function m(v){var u=Array.prototype.slice.call(arguments,1);if(q){if(o===v){return}else{var w=q;q=null;o=null;p.apply(null,[w,null].concat(u))}}var t=e.computeStackTrace(v);q=t;o=v;h.setTimeout(function(){if(o===v){q=null;o=null;p.apply(null,[t,null].concat(u))}},(t.incomplete?2000:0));throw v}m.subscribe=l;m.unsubscribe=r;return m}());e.computeStackTrace=(function b(){var u=false,q={};function l(D){if(!e.remoteFetching){return""}try{var C;if(typeof(XMLHttpRequest)==="undefined"){C=function E(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(H){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(H){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(H){}try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(H){}throw new Error("No XHR.")}}else{C=XMLHttpRequest}var F=new C();F.open("GET",D,false);F.send("");return F.responseText}catch(G){return""}}function t(C){if(!e._has(q,C)){var D;if(C.indexOf(document.domain)!==-1){D=l(C)}else{D=[]}q[C]=D.length?D.split("\n"):[]}return q[C]}function z(D,F){var J=/function ([^(]*)\(([^)]*)\)/,G=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,K="",I=10,C=t(D),E;if(!C.length){return"?"}for(var H=0;H0?G:null}function m(C){return C.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function x(C){return m(C).replace("<","(?:<|<)").replace(">","(?:>|>)").replace("&","(?:&|&)").replace('"','(?:"|")').replace(/\s+/g,"\\s+")}function o(F,H){var G,C;for(var E=0,D=H.length;ED&&(C=G.exec(H[D]))){return C.index}return null}function v(H){var N=[h.location.href],I=document.getElementsByTagName("script"),L,F=""+H,E=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,G=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,P,J,Q;for(var K=0;K]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i,L=J.split("\n"),I=[],C;for(var F=0,D=L.length;F=0){V.line=D+Q.substring(0,K).split("\n").length}}}}else{if((P=C.exec(E[R]))){var J=h.location.href.replace(/#.*$/,""),M=P[1];var O=new RegExp(x(E[R+1]));Q=o(O,[J]);V={url:J,line:Q?Q.line:M,func:""}}}}if(V){if(!V.func){V.func=z(V.url,V.line)}var H=B(V.url,V.line);var N=(H?H[Math.floor(H.length/2)]:null);if(H&&N.replace(/^\s*/,"")===E[R+1].replace(/^\s*/,"")){V.context=H}else{V.context=[E[R+1]]}L.push(V)}}if(!L.length){return null}return{mode:"multiline",name:U.name,message:E[0],url:document.location.href,stack:L,useragent:navigator.userAgent}}function y(G,E,H,F){var D={url:E,line:H};if(D.url&&D.line){G.incomplete=false;if(!D.func){D.func=z(D.url,D.line)}if(!D.context){D.context=B(D.url,D.line)}var C=/ '([^']+)' /.exec(F);if(C){D.column=A(C[1],D.url,D.line)}if(G.stack.length>0){if(G.stack[0].url===D.url){if(G.stack[0].line===D.line){return false}else{if(!G.stack[0].line&&G.stack[0].func===D.func){G.stack[0].line=D.line;G.stack[0].context=D.context;return false}}}}G.stack.unshift(D);G.partial=true;return true}else{G.incomplete=true}return false}function n(J,H){var I=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,K=[],D={},F=false,G,L,C;for(var N=n.caller;N&&!F;N=N.caller){if(N===r||N===e.report){continue}L={url:null,func:"?",line:null,column:null};if(N.name){L.func=N.name}else{if((G=I.exec(N.toString()))){L.func=G[1]}}if((C=v(N))){L.url=C.url;L.line=C.line;if(L.func==="?"){L.func=z(L.url,L.line)}var E=/ '([^']+)' /.exec(J.message||J.description);if(E){L.column=A(E[1],C.url,C.line)}}if(D[""+N]){F=true}else{D[""+N]=true}K.push(L)}if(H){K.splice(0,H)}var M={mode:"callers",name:J.name,message:J.message,url:document.location.href,stack:K,useragent:navigator.userAgent};y(M,J.sourceURL||J.fileName,J.line||J.lineNumber,J.message||J.description);return M}function r(D,F){var C=null;F=(F==null?0:+F);try{C=s(D);if(C){return C}}catch(E){if(u){throw E}}try{C=w(D);if(C){return C}}catch(E){if(u){throw E}}try{C=p(D);if(C){return C}}catch(E){if(u){throw E}}try{C=n(D,F+1);if(C){return C}}catch(E){if(u){throw E}}return{mode:"failed"}}function k(D){D=(D==null?0:+D)+1;try{throw new Error()}catch(C){return r(C,D+1)}return null}r.augmentStackTraceWithInitialElement=y;r.guessFunctionName=z;r.gatherContext=B;r.ofCaller=k;return r}());(function f(k){var l=function l(o){var n=k[o];k[o]=function m(){var p=Array.prototype.slice.call(arguments,0);var r=p[0];if(typeof(r)==="function"){p[0]=function q(){try{r.apply(this,arguments)}catch(s){e.report(s);throw s}}}if(n.apply){return n.apply(this,p)}else{return n(p[0],p[1])}}};l("setTimeout");l("setInterval")}(h));(function c(q){if(!q){return}var p=q.event.add;q.event.add=function n(w,u,v,x,r){var s;if(v.handler){s=v.handler;v.handler=function t(){try{return s.apply(this,arguments)}catch(z){e.report(z);throw z}}}else{s=v;v=function y(){try{return s.apply(this,arguments)}catch(z){e.report(z);throw z}}}if(s.guid){v.guid=s.guid}else{v.guid=s.guid=q.guid++}return p.call(this,w,u,v,x,r)};var l=q.fn.ready;q.fn.ready=function k(r){var s=function(){try{return r.apply(this,arguments)}catch(t){e.report(t);throw t}};return l.call(this,s)};var o=q.ajax;q.ajax=function m(x){if(q.isFunction(x.complete)){var v=x.complete;x.complete=function u(){try{return v.apply(this,arguments)}catch(s){e.report(s);throw s}}}if(q.isFunction(x.error)){var r=x.error;x.error=function z(){try{return r.apply(this,arguments)}catch(s){e.report(s);throw s}}}if(q.isFunction(x.success)){var w=x.success;x.success=function t(){try{return w.apply(this,arguments)}catch(s){e.report(s);throw s}}}try{return o.call(this,x)}catch(y){e.report(y);throw y}}}(h.jQuery));if(!e.remoteFetching){e.remoteFetching=true}if(!e.collectWindowErrors){e.collectWindowErrors=true}if(!e.linesOfContext||e.linesOfContext<1){e.linesOfContext=11}h.TraceKit=e}(window)); \ No newline at end of file +(function(j,e){var f={};var l=j.TraceKit;var m=[].slice;var h="?";function c(n,o){return Object.prototype.hasOwnProperty.call(n,o)}function d(n){return typeof n==="undefined"}f.noConflict=function i(){j.TraceKit=l;return f};f.wrap=function a(o){function n(){try{return o.apply(this,arguments)}catch(p){f.report(p);throw p}}return n};f.report=(function k(){var n=[],t=null,v=null;function o(y){q();n.push(y)}function w(z){for(var y=n.length-1;y>=0;--y){if(n[y]===z){n.splice(y,1)}}}function u(y,A){var C=null;if(A&&!f.collectWindowErrors){return}for(var B in n){if(c(n,B)){try{n[B].apply(null,[y].concat(m.call(arguments,2)))}catch(z){C=z}}}if(C){throw C}}var x,r;function s(B,A,C){var y=null;if(v){f.computeStackTrace.augmentStackTraceWithInitialElement(v,A,C,B);y=v;v=null;t=null}else{var z={url:A,line:C};z.func=f.computeStackTrace.guessFunctionName(z.url,z.line);z.context=f.computeStackTrace.gatherContext(z.url,z.line);y={mode:"onerror",message:B,url:document.location.href,stack:[z],useragent:navigator.userAgent}}u(y,"from window.onerror");if(x){return x.apply(this,arguments)}return false}function q(){if(r===true){return}x=j.onerror;j.onerror=s;r=true}function p(A){var z=m.call(arguments,1);if(v){if(t===A){return}else{var B=v;v=null;t=null;u.apply(null,[B,null].concat(z))}}var y=f.computeStackTrace(A);v=y;t=A;j.setTimeout(function(){if(t===A){v=null;t=null;u.apply(null,[y,null].concat(z))}},(y.incomplete?2000:0));throw A}p.subscribe=o;p.unsubscribe=w;return p}());f.computeStackTrace=(function b(){var x=false,t={};function o(F){if(!f.remoteFetching){return""}try{var I=function(){try{return new j.XMLHttpRequest()}catch(J){return new j.ActiveXObject("Microsoft.XMLHTTP")}};var G=I();G.open("GET",F,false);G.send("");return G.responseText}catch(H){return""}}function w(F){if(!c(t,F)){var G="";if(F.indexOf(document.domain)!==-1){G=o(F)}t[F]=G?G.split("\n"):[]}return t[F]}function C(G,I){var M=/function ([^(]*)\(([^)]*)\)/,J=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,N="",L=10,F=w(G),H;if(!F.length){return h}for(var K=0;K0?J:null}function p(F){return F.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function A(F){return p(F).replace("<","(?:<|<)").replace(">","(?:>|>)").replace("&","(?:&|&)").replace('"','(?:"|")').replace(/\s+/g,"\\s+")}function r(I,K){var J,F;for(var H=0,G=K.length;HG&&(F=J.exec(K[G]))){return F.index}return null}function y(K){var Q=[j.location.href],L=document.getElementsByTagName("script"),O,I=""+K,H=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,J=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,S,M,T;for(var N=0;N]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i,O=M.split("\n"),L=[],F;for(var I=0,G=O.length;I=0){Y.line=G+T.substring(0,N).split("\n").length}}}}else{if((S=F.exec(H[U]))){var M=j.location.href.replace(/#.*$/,""),P=S[1];var R=new RegExp(A(H[U+1]));T=r(R,[M]);Y={url:M,line:T?T.line:P,func:""}}}}if(Y){if(!Y.func){Y.func=C(Y.url,Y.line)}var K=E(Y.url,Y.line);var Q=(K?K[Math.floor(K.length/2)]:null);if(K&&Q.replace(/^\s*/,"")===H[U+1].replace(/^\s*/,"")){Y.context=K}else{Y.context=[H[U+1]]}O.push(Y)}}if(!O.length){return null}return{mode:"multiline",name:X.name,message:H[0],url:document.location.href,stack:O,useragent:navigator.userAgent}}function B(J,H,K,I){var G={url:H,line:K};if(G.url&&G.line){J.incomplete=false;if(!G.func){G.func=C(G.url,G.line)}if(!G.context){G.context=E(G.url,G.line)}var F=/ '([^']+)' /.exec(I);if(F){G.column=D(F[1],G.url,G.line)}if(J.stack.length>0){if(J.stack[0].url===G.url){if(J.stack[0].line===G.line){return false}else{if(!J.stack[0].line&&J.stack[0].func===G.func){J.stack[0].line=G.line;J.stack[0].context=G.context;return false}}}}J.stack.unshift(G);J.partial=true;return true}else{J.incomplete=true}return false}function q(M,K){var L=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,N=[],G={},I=false,J,O,F;for(var Q=q.caller;Q&&!I;Q=Q.caller){if(Q===u||Q===f.report){continue}O={url:null,func:h,line:null,column:null};if(Q.name){O.func=Q.name}else{if((J=L.exec(Q.toString()))){O.func=J[1]}}if((F=y(Q))){O.url=F.url;O.line=F.line;if(O.func===h){O.func=C(O.url,O.line)}var H=/ '([^']+)' /.exec(M.message||M.description);if(H){O.column=D(H[1],F.url,F.line)}}if(G[""+Q]){I=true}else{G[""+Q]=true}N.push(O)}if(K){N.splice(0,K)}var P={mode:"callers",name:M.name,message:M.message,url:document.location.href,stack:N,useragent:navigator.userAgent};B(P,M.sourceURL||M.fileName,M.line||M.lineNumber,M.message||M.description);return P}function u(G,I){var F=null;I=(I==null?0:+I);try{F=v(G);if(F){return F}}catch(H){if(x){throw H}}try{F=z(G);if(F){return F}}catch(H){if(x){throw H}}try{F=s(G);if(F){return F}}catch(H){if(x){throw H}}try{F=q(G,I+1);if(F){return F}}catch(H){if(x){throw H}}return{mode:"failed"}}function n(G){G=(G==null?0:+G)+1;try{throw new Error()}catch(F){return u(F,G+1)}}u.augmentStackTraceWithInitialElement=B;u.guessFunctionName=C;u.gatherContext=E;u.ofCaller=n;return u}());(function g(){var n=function n(q){var p=j[q];j[q]=function o(){var r=m.call(arguments);var s=r[0];if(typeof(s)==="function"){r[0]=f.wrap(s)}if(p.apply){return p.apply(this,r)}else{return p(r[0],r[1])}}};n("setTimeout");n("setInterval")}());if(!f.remoteFetching){f.remoteFetching=true}if(!f.collectWindowErrors){f.collectWindowErrors=true}if(!f.linesOfContext||f.linesOfContext<1){f.linesOfContext=11}j.TraceKit=f}(window)); \ No newline at end of file