diff --git a/src/ng/browser.js b/src/ng/browser.js index a9299343778d..af2dd70e76a9 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -61,6 +61,11 @@ function Browser(window, document, $log, $sniffer) { } } + function getHash(url) { + var index = url.indexOf('#'); + return index === -1 ? '' : url.substr(index + 1); + } + /** * @private * Note: this method is used only by scenario runner @@ -190,8 +195,10 @@ function Browser(window, document, $log, $sniffer) { } if (replace) { location.replace(url); - } else { + } else if (!sameBase) { location.href = url; + } else { + location.hash = getHash(url); } } return self; diff --git a/test/ng/browserSpecs.js b/test/ng/browserSpecs.js index 3778e0a6d904..d665bbdc87a0 100755 --- a/test/ng/browserSpecs.js +++ b/test/ng/browserSpecs.js @@ -1,5 +1,7 @@ 'use strict'; +/* global getHash:true, stripHash:true */ + var historyEntriesLength; var sniffer = {}; @@ -51,6 +53,12 @@ function MockWindow(options) { mockWindow.history.state = null; historyEntriesLength++; }, + get hash() { + return getHash(locationHref); + }, + set hash(value) { + locationHref = stripHash(locationHref) + '#' + value; + }, replace: function(url) { locationHref = url; mockWindow.history.state = null; @@ -550,6 +558,17 @@ describe('browser', function() { expect(locationReplace).not.toHaveBeenCalled(); }); + it("should retain the # character when the only change is clearing the hash fragment, to prevent page reload", function() { + sniffer.history = true; + + browser.url('http://server/#123'); + expect(fakeWindow.location.href).toEqual('http://server/#123'); + + browser.url('http://server/'); + expect(fakeWindow.location.href).toEqual('http://server/#'); + + }); + it('should use location.replace when history.replaceState not available', function() { sniffer.history = false; browser.url('http://new.org', true); @@ -561,6 +580,7 @@ describe('browser', function() { expect(fakeWindow.location.href).toEqual('http://server/'); }); + it('should use location.replace and not use replaceState when the url only changed in the hash fragment to please IE10/11', function() { sniffer.history = true; browser.url('http://server/#123', true); @@ -572,6 +592,7 @@ describe('browser', function() { expect(fakeWindow.location.href).toEqual('http://server/'); }); + it('should return $browser to allow chaining', function() { expect(browser.url('http://any.com')).toBe(browser); });