diff options
| -rw-r--r-- | src/ng/browser.js | 12 | ||||
| -rwxr-xr-x | test/ng/browserSpecs.js | 27 | 
2 files changed, 31 insertions, 8 deletions
diff --git a/src/ng/browser.js b/src/ng/browser.js index 768720e7..7a0e3fec 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -125,7 +125,7 @@ function Browser(window, document, $log, $sniffer) {    var lastBrowserUrl = location.href,        baseElement = document.find('base'), -      replacedUrl = null; +      newLocation = null;    /**     * @name ng.$browser#url @@ -163,21 +163,20 @@ function Browser(window, document, $log, $sniffer) {            baseElement.attr('href', baseElement.attr('href'));          }        } else { +        newLocation = url;          if (replace) {            location.replace(url); -          replacedUrl = url;          } else {            location.href = url; -          replacedUrl = null;          }        }        return self;      // getter      } else { -      // - the replacedUrl is a workaround for an IE8-9 issue with location.replace method that doesn't update -      //   location.href synchronously +      // - newLocation is a workaround for an IE7-9 issue with location.replace and location.href +      //   methods not updating location.href synchronously.        // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 -      return replacedUrl || location.href.replace(/%27/g,"'"); +      return newLocation || location.href.replace(/%27/g,"'");      }    }; @@ -185,6 +184,7 @@ function Browser(window, document, $log, $sniffer) {        urlChangeInit = false;    function fireUrlChange() { +    newLocation = null;      if (lastBrowserUrl == self.url()) return;      lastBrowserUrl = self.url(); diff --git a/test/ng/browserSpecs.js b/test/ng/browserSpecs.js index 3ec78e61..6c6ac30e 100755 --- a/test/ng/browserSpecs.js +++ b/test/ng/browserSpecs.js @@ -287,7 +287,7 @@ describe('browser', function() {        it('should default path in cookie to "" (empty string)', function () {          browser.cookies('cookie', 'bender');          // This only fails in Safari and IE when cookiePath returns undefined -        // Where it now succeeds since baseHref return '' instead of undefined          +        // Where it now succeeds since baseHref return '' instead of undefined          expect(document.cookie).toEqual('cookie=bender');        });      }); @@ -535,9 +535,32 @@ describe('browser', function() {        fakeWindow.setTimeout.flush();        expect(callback).toHaveBeenCalledWith('http://server.new'); +      callback.reset(); +        fakeWindow.fire('popstate');        fakeWindow.fire('hashchange'); -      expect(callback).toHaveBeenCalledOnce(); +      expect(callback).not.toHaveBeenCalled(); +    }); + +    describe('after an initial location change by browser.url method when neither history nor hashchange supported', function() { +      beforeEach(function() { +        sniffer.history = false; +        sniffer.hashchange = false; +        browser.url("http://server.current"); +      }); + +      it('should fire callback with the correct URL on location change outside of angular', function() { +        browser.onUrlChange(callback); + +        fakeWindow.location.href = 'http://server.new'; +        fakeWindow.setTimeout.flush(); +        expect(callback).toHaveBeenCalledWith('http://server.new'); + +        fakeWindow.fire('popstate'); +        fakeWindow.fire('hashchange'); +        expect(callback).toHaveBeenCalledOnce(); +      }); +      });      it('should not fire urlChange if changed by browser.url method (polling)', function() {  | 
