Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
fix($browser): prevent infinite digests when clearing the hash of a url
Browse files Browse the repository at this point in the history
By using `location.hash` to update the current browser location when only
the hash has changed, we prevent the browser from attempting to reload.

Closes #9629
Closes #9635
Closes #10228
Closes #10308
  • Loading branch information
petebacondarwin committed Dec 4, 2014
1 parent d21dff2 commit 10ac594
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/ng/browser.js
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
21 changes: 21 additions & 0 deletions test/ng/browserSpecs.js
@@ -1,5 +1,7 @@
'use strict';

/* global getHash:true, stripHash:true */

var historyEntriesLength;
var sniffer = {};

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
});
Expand Down

0 comments on commit 10ac594

Please sign in to comment.