diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Browser.js | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/Browser.js b/src/Browser.js index 8abdbc61..0e265c0c 100644 --- a/src/Browser.js +++ b/src/Browser.js @@ -8,6 +8,7 @@ function Browser(location, document) { this.urlListeners = []; this.hoverListener = noop; this.isMock = false; + this.outstandingRequests = { count: 0, callbacks:[]}; this.XHR = window.XMLHttpRequest || function () { try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e1) {} @@ -57,16 +58,42 @@ Browser.prototype = { callback = post; post = null; } - var xhr = new this.XHR(); + var xhr = new this.XHR(), + self = this; xhr.open(method, url, true); + this.outstandingRequests.count ++; xhr.onreadystatechange = function() { if (xhr.readyState == 4) { - callback(xhr.status || 200, xhr.responseText); + try { + callback(xhr.status || 200, xhr.responseText); + } finally { + self.outstandingRequests.count--; + self.processRequestCallbacks(); + } } }; xhr.send(post || ''); }, + processRequestCallbacks: function(){ + if (this.outstandingRequests.count === 0) { + while(this.outstandingRequests.callbacks.length) { + try { + this.outstandingRequests.callbacks.pop()(); + } catch (e) { + } + } + } + }, + + notifyWhenNoOutstandingRequests: function(callback){ + if (this.outstandingRequests.count === 0) { + callback(); + } else { + this.outstandingRequests.callbacks.push(callback); + } + }, + watchUrl: function(fn){ this.urlListeners.push(fn); }, |
