aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngel Balcarcel2013-08-09 10:29:22 -0400
committerBrian Ford2013-10-02 15:33:31 -0700
commitd70711481e6311c9cd283d650f07ca0cca72ecc2 (patch)
treeb8bc70a4bab8eb0a90897172513429271d671228
parent78a5889bc691d95e5b037c99de3607f02a69a188 (diff)
downloadangular.js-d70711481e6311c9cd283d650f07ca0cca72ecc2.tar.bz2
fix($location): prevent infinite digest error in IE7
Refactored `replacedUrl` to store the new URL on both `location.replace` and setting `location.href` directly to handle delays in the actual location value change in IE. Closes #2802
-rw-r--r--src/ng/browser.js12
-rwxr-xr-xtest/ng/browserSpecs.js27
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() {