@@ -192,13 +192,19 @@ class Events
192192
193193_XMLHttpRequest = window .XMLHttpRequest
194194_XDomainRequest = window .XDomainRequest
195+ _WebSocket = window .WebSocket
196+
197+ extendNative = (to , from ) ->
198+ for key, val of from ::
199+ if not to[key]? and typeof val isnt ' function'
200+ to[key] = val
195201
196202# We should only ever instantiate one of these
197203class RequestIntercept extends Events
198204 constructor : ->
199205 super
200206
201- monitor = (req ) =>
207+ monitorXHR = (req ) =>
202208 _open = req .open
203209 req .open = (type , url , async ) =>
204210 @ trigger ' request' , {type, url, request : req}
@@ -208,33 +214,49 @@ class RequestIntercept extends Events
208214 window .XMLHttpRequest = ->
209215 req = new _XMLHttpRequest
210216
211- monitor req
217+ monitorXHR req
212218
213219 req
214220
221+ extendNative window .XMLHttpRequest , _XMLHttpRequest
222+
215223 if _XDomainRequest?
216224 window .XDomainRequest = ->
217225 req = new _XDomainRequest
218226
219- monitor req
227+ monitorXHR req
228+
229+ req
230+
231+ extendNative window .XDomainRequest , _XDomainRequest
232+
233+ if _WebSocket?
234+ window .WebSocket = (url , protocols ) =>
235+ req = new _WebSocket (url, protocols)
236+
237+ @ trigger ' request' , {type : ' socket' , url, protocols, request : req}
220238
221239 req
222240
241+ extendNative window .WebSocket , _WebSocket
242+
223243intercept = new RequestIntercept
224244
225245class AjaxMonitor
226246 constructor : ->
227247 @elements = []
228248
229- intercept .on ' request' , ({request}) =>
230- @ watch request
249+ intercept .on ' request' , => @ watch arguments ...
231250
232- watch : (request ) ->
233- tracker = new RequestTracker (request)
251+ watch : ({type, request}) ->
252+ if type is ' socket'
253+ tracker = new SocketRequestTracker (request)
254+ else
255+ tracker = new XHRRequestTracker (request)
234256
235257 @elements .push tracker
236258
237- class RequestTracker
259+ class XHRRequestTracker
238260 constructor : (request ) ->
239261 @progress = 0
240262
@@ -268,7 +290,7 @@ class RequestTracker
268290 _onprogress? (arguments ... )
269291
270292 for handler in [' onload' , ' onabort' , ' ontimeout' , ' onerror' ]
271- do =>
293+ do ( handler ) =>
272294 fn = request[handler]
273295 request[handler] = =>
274296 @progress = 100
@@ -285,6 +307,14 @@ class RequestTracker
285307
286308 _onreadystatechange? (arguments ... )
287309
310+ class SocketRequestTracker
311+ constructor : (request ) ->
312+ @progress = 0
313+
314+ for event in [' error' , ' open' ]
315+ request .addEventListener event, =>
316+ @progress = 100
317+
288318class ElementMonitor
289319 constructor : (options = {}) ->
290320 @elements = []
0 commit comments