diff --git a/src/ng/browser.js b/src/ng/browser.js index 768720e76a89..7a0e3fec29aa 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 3ec78e615341..6c6ac30e2195 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() {