aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndres Ornelas2010-05-26 15:21:58 -0700
committerAndres Ornelas2010-05-26 15:21:58 -0700
commitaedf12f25e42877a302a99d906e6397bde01dcce (patch)
treefd6ac4fe05668128937261093752b36c1bb02a6a
parent0d41c86522ef912fe5bb7a02fd434080f9827c00 (diff)
downloadangular.js-aedf12f25e42877a302a99d906e6397bde01dcce.tar.bz2
added outstanding request queue
-rw-r--r--src/Browser.js31
-rw-r--r--test/BrowserSpecs.js48
-rw-r--r--test/BrowserTest.js25
3 files changed, 77 insertions, 27 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);
},
diff --git a/test/BrowserSpecs.js b/test/BrowserSpecs.js
new file mode 100644
index 00000000..3ce158b4
--- /dev/null
+++ b/test/BrowserSpecs.js
@@ -0,0 +1,48 @@
+describe('browser', function(){
+
+ var browser, location;
+
+ beforeEach(function(){
+ location = {href:"http://server", hash:""};
+ browser = new Browser(location, {});
+ browser.setTimeout = noop;
+ });
+
+ it('should watch url', function(){
+ browser.delay = 1;
+ expectAsserts(2);
+ browser.watchUrl(function(url){
+ assertEquals('http://getangular.test', url);
+ });
+ browser.setTimeout = function(fn, delay){
+ assertEquals(1, delay);
+ location.href = "http://getangular.test";
+ browser.setTimeout = function(fn, delay) {};
+ fn();
+ };
+ browser.startUrlWatcher();
+ });
+
+ describe('outstading requests', function(){
+ it('should process callbacks immedietly with no outstanding requests', function(){
+ var callback = jasmine.createSpy('callback');
+ browser.notifyWhenNoOutstandingRequests(callback);
+ expect(callback).wasCalled();
+ });
+
+ it('should queue callbacks with outstanding requests', function(){
+ var callback = jasmine.createSpy('callback');
+ browser.outstandingRequests.count = 1;
+ browser.notifyWhenNoOutstandingRequests(callback);
+ expect(callback).not.wasCalled();
+
+ browser.processRequestCallbacks();
+ expect(callback).not.wasCalled();
+
+ browser.outstandingRequests.count = 0;
+ browser.processRequestCallbacks();
+ expect(callback).wasCalled();
+ });
+ });
+
+});
diff --git a/test/BrowserTest.js b/test/BrowserTest.js
deleted file mode 100644
index 5254840a..00000000
--- a/test/BrowserTest.js
+++ /dev/null
@@ -1,25 +0,0 @@
-BrowserTest = TestCase('BrowserTest');
-
-BrowserTest.prototype.testUrlWatcher = function () {
- expectAsserts(2);
- var location = {href:"http://server", hash:""};
- var watcher = new Browser(location, {});
- watcher.delay = 1;
- watcher.watchUrl(function(url){
- assertEquals('http://getangular.test', url);
- });
- watcher.setTimeout = function(fn, delay){
- assertEquals(1, delay);
- location.href = "http://getangular.test";
- watcher.setTimeout = function(fn, delay) {
- };
- fn();
- };
- watcher.startUrlWatcher();
-};
-
-FunctionTest = TestCase("FunctionTest");
-
-FunctionTest.prototype.testEscapeHtml = function () {
- assertEquals("&lt;div&gt;&amp;amp;&lt;/div&gt;", escapeHtml('<div>&amp;</div>'));
-};