From aedf12f25e42877a302a99d906e6397bde01dcce Mon Sep 17 00:00:00 2001 From: Andres Ornelas Date: Wed, 26 May 2010 15:21:58 -0700 Subject: added outstanding request queue --- src/Browser.js | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src') 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); }, -- cgit v1.2.3