Skip to content

Commit d856e90

Browse files
committed
Support tracking of websocket opening. Pass native XHR constants onto created functions.
1 parent 8ac5f53 commit d856e90

3 files changed

Lines changed: 111 additions & 27 deletions

File tree

pace.coffee

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
197203
class 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+
223243
intercept = new RequestIntercept
224244

225245
class 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+
288318
class ElementMonitor
289319
constructor: (options={}) ->
290320
@elements = []

pace.js

Lines changed: 71 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)