|
3 | 3 | * |
4 | 4 | * Patches event handler callbacks and ajax callbacks. |
5 | 5 | */ |
6 | | -;(function(window) { |
7 | 6 | 'use strict'; |
8 | 7 |
|
9 | | -if (window.Raven) Raven.addPlugin(function jQueryPlugin() { |
10 | | - |
11 | | -var $ = window.jQuery; |
12 | | - |
13 | | -// quit if jQuery isn't on the page |
14 | | -if (!$) return; |
15 | | - |
16 | | -var _oldEventAdd = $.event.add; |
17 | | -$.event.add = function ravenEventAdd(elem, types, handler, data, selector) { |
18 | | - var _handler; |
19 | | - |
20 | | - if (handler && handler.handler) { |
21 | | - _handler = handler.handler; |
22 | | - handler.handler = Raven.wrap(handler.handler); |
23 | | - } else { |
24 | | - _handler = handler; |
25 | | - handler = Raven.wrap(handler); |
26 | | - } |
27 | | - |
28 | | - // If the handler we are attaching doesn’t have the same guid as |
29 | | - // the original, it will never be removed when someone tries to |
30 | | - // unbind the original function later. Technically as a result of |
31 | | - // this our guids are no longer globally unique, but whatever, that |
32 | | - // never hurt anybody RIGHT?! |
33 | | - if (_handler.guid) { |
34 | | - handler.guid = _handler.guid; |
35 | | - } else { |
36 | | - handler.guid = _handler.guid = $.guid++; |
37 | | - } |
38 | | - |
39 | | - return _oldEventAdd.call(this, elem, types, handler, data, selector); |
40 | | -}; |
| 8 | +var Raven = require('../src/raven'); |
41 | 9 |
|
42 | | -var _oldReady = $.fn.ready; |
43 | | -$.fn.ready = function ravenjQueryReadyWrapper(fn) { |
44 | | - return _oldReady.call(this, Raven.wrap(fn)); |
45 | | -}; |
| 10 | +function install(jQuery) { |
| 11 | + var $ = jQuery || window.jQuery; |
46 | 12 |
|
47 | | -var _oldAjax = $.ajax; |
48 | | -$.ajax = function ravenAjaxWrapper(url, options) { |
49 | | - var keys = ['complete', 'error', 'success'], key; |
| 13 | + // quit if jQuery isn't on the page |
50 | 14 |
|
51 | | - // Taken from https://github.com/jquery/jquery/blob/eee2eaf1d7a189d99106423a4206c224ebd5b848/src/ajax.js#L311-L318 |
52 | | - // If url is an object, simulate pre-1.5 signature |
53 | | - if (typeof url === 'object') { |
54 | | - options = url; |
55 | | - url = undefined; |
56 | | - } |
| 15 | + var _oldEventAdd = $.event.add; |
| 16 | + $.event.add = function ravenEventAdd(elem, types, handler, data, selector) { |
| 17 | + var _handler; |
57 | 18 |
|
58 | | - // Force options to be an object |
59 | | - options = options || {}; |
| 19 | + if (handler && handler.handler) { |
| 20 | + _handler = handler.handler; |
| 21 | + handler.handler = Raven.wrap(handler.handler); |
| 22 | + } else { |
| 23 | + _handler = handler; |
| 24 | + handler = Raven.wrap(handler); |
| 25 | + } |
60 | 26 |
|
61 | | - /*jshint -W084*/ |
62 | | - while (key = keys.pop()) { |
63 | | - if ($.isFunction(options[key])) { |
64 | | - options[key] = Raven.wrap(options[key]); |
| 27 | + // If the handler we are attaching doesn’t have the same guid as |
| 28 | + // the original, it will never be removed when someone tries to |
| 29 | + // unbind the original function later. Technically as a result of |
| 30 | + // this our guids are no longer globally unique, but whatever, that |
| 31 | + // never hurt anybody RIGHT?! |
| 32 | + if (_handler.guid) { |
| 33 | + handler.guid = _handler.guid; |
| 34 | + } else { |
| 35 | + handler.guid = _handler.guid = $.guid++; |
65 | 36 | } |
66 | | - } |
67 | | - /*jshint +W084*/ |
68 | | - |
69 | | - try { |
70 | | - var jqXHR = _oldAjax.call(this, url, options); |
71 | | - // jqXHR.complete is not a regular deferred callback |
72 | | - if ($.isFunction(jqXHR.complete)) |
73 | | - jqXHR.complete = Raven.wrap(jqXHR.complete); |
74 | | - return jqXHR; |
75 | | - } catch (e) { |
76 | | - Raven.captureException(e); |
77 | | - throw e; |
78 | | - } |
79 | | -}; |
80 | 37 |
|
81 | | -var _oldDeferred = $.Deferred; |
82 | | -$.Deferred = function ravenDeferredWrapper(func) { |
83 | | - return !_oldDeferred ? null : _oldDeferred(function beforeStartWrapper(deferred) { |
84 | | - var methods = ['resolve', 'reject', 'notify', 'resolveWith', 'rejectWith', 'notifyWith'], method; |
| 38 | + return _oldEventAdd.call(this, elem, types, handler, data, selector); |
| 39 | + }; |
| 40 | + |
| 41 | + var _oldReady = $.fn.ready; |
| 42 | + $.fn.ready = function ravenjQueryReadyWrapper(fn) { |
| 43 | + return _oldReady.call(this, Raven.wrap(fn)); |
| 44 | + }; |
| 45 | + |
| 46 | + var _oldAjax = $.ajax; |
| 47 | + $.ajax = function ravenAjaxWrapper(url, options) { |
| 48 | + var keys = ['complete', 'error', 'success'], key; |
85 | 49 |
|
86 | | - // since jQuery 1.9, deferred[resolve | reject | notify] are calling internally |
87 | | - // deferred[resolveWith | rejectWith | notifyWith] but we need to wrap them as well |
88 | | - // to support all previous versions. |
| 50 | + // Taken from https://github.com/jquery/jquery/blob/eee2eaf1d7a189d99106423a4206c224ebd5b848/src/ajax.js#L311-L318 |
| 51 | + // If url is an object, simulate pre-1.5 signature |
| 52 | + if (typeof url === 'object') { |
| 53 | + options = url; |
| 54 | + url = undefined; |
| 55 | + } |
| 56 | + |
| 57 | + // Force options to be an object |
| 58 | + options = options || {}; |
89 | 59 |
|
90 | 60 | /*jshint -W084*/ |
91 | | - while (method = methods.pop()) { |
92 | | - if ($.isFunction(deferred[method])) { |
93 | | - deferred[method] = Raven.wrap(deferred[method]); |
| 61 | + while (key = keys.pop()) { |
| 62 | + if ($.isFunction(options[key])) { |
| 63 | + options[key] = Raven.wrap(options[key]); |
94 | 64 | } |
95 | 65 | } |
96 | 66 | /*jshint +W084*/ |
97 | 67 |
|
98 | | - // Call given func if any |
99 | | - if (func) { |
100 | | - func.call(deferred, deferred); |
| 68 | + try { |
| 69 | + var jqXHR = _oldAjax.call(this, url, options); |
| 70 | + // jqXHR.complete is not a regular deferred callback |
| 71 | + if ($.isFunction(jqXHR.complete)) |
| 72 | + jqXHR.complete = Raven.wrap(jqXHR.complete); |
| 73 | + return jqXHR; |
| 74 | + } catch (e) { |
| 75 | + Raven.captureException(e); |
| 76 | + throw e; |
101 | 77 | } |
102 | | - }); |
103 | | -}; |
| 78 | + }; |
| 79 | + |
| 80 | + var _oldDeferred = $.Deferred; |
| 81 | + $.Deferred = function ravenDeferredWrapper(func) { |
| 82 | + return !_oldDeferred ? null : _oldDeferred(function beforeStartWrapper(deferred) { |
| 83 | + var methods = ['resolve', 'reject', 'notify', 'resolveWith', 'rejectWith', 'notifyWith'], method; |
| 84 | + |
| 85 | + // since jQuery 1.9, deferred[resolve | reject | notify] are calling internally |
| 86 | + // deferred[resolveWith | rejectWith | notifyWith] but we need to wrap them as well |
| 87 | + // to support all previous versions. |
| 88 | + |
| 89 | + /*jshint -W084*/ |
| 90 | + while (method = methods.pop()) { |
| 91 | + if ($.isFunction(deferred[method])) { |
| 92 | + deferred[method] = Raven.wrap(deferred[method]); |
| 93 | + } |
| 94 | + } |
| 95 | + /*jshint +W084*/ |
104 | 96 |
|
105 | | -// End of plugin factory |
106 | | -}); |
| 97 | + // Call given func if any |
| 98 | + if (func) { |
| 99 | + func.call(deferred, deferred); |
| 100 | + } |
| 101 | + }); |
| 102 | + }; |
| 103 | +} |
107 | 104 |
|
108 | | -}(typeof window !== 'undefined' ? window : this)); |
| 105 | +module.exports = { |
| 106 | + install: install |
| 107 | +}; |
0 commit comments