diff options
| author | Andres Ornelas | 2010-05-26 15:21:58 -0700 |
|---|---|---|
| committer | Andres Ornelas | 2010-05-26 15:21:58 -0700 |
| commit | aedf12f25e42877a302a99d906e6397bde01dcce (patch) | |
| tree | fd6ac4fe05668128937261093752b36c1bb02a6a | |
| parent | 0d41c86522ef912fe5bb7a02fd434080f9827c00 (diff) | |
| download | angular.js-aedf12f25e42877a302a99d906e6397bde01dcce.tar.bz2 | |
added outstanding request queue
| -rw-r--r-- | src/Browser.js | 31 | ||||
| -rw-r--r-- | test/BrowserSpecs.js | 48 | ||||
| -rw-r--r-- | test/BrowserTest.js | 25 |
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("<div>&amp;</div>", escapeHtml('<div>&</div>')); -}; |
