From 97abb124738e0ca5d00d807d65c482f7890feadd Mon Sep 17 00:00:00 2001 From: Pavel Vasek Date: Fri, 24 May 2013 18:23:55 +0200 Subject: [PATCH] fix($location): prevent infinite digest error due to IE bug If an app uses HTML5 mode and we open an html5 url on IE8 or 9 which don't support location href, we use location.replace to reload the page with the hashbang equivalent of the url but this fails with infinite digest. This is because location.replace doesn't update location.href synchronously on IE8 and 9. Closes #2802, #3305, #1417 --- src/ng/browser.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/ng/browser.js b/src/ng/browser.js index a723271b95ec..65f8dc2b2457 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -124,7 +124,8 @@ function Browser(window, document, $log, $sniffer) { ////////////////////////////////////////////////////////////// var lastBrowserUrl = location.href, - baseElement = document.find('base'); + baseElement = document.find('base'), + replacedUrl = null; /** * @name ng.$browser#url @@ -159,14 +160,21 @@ function Browser(window, document, $log, $sniffer) { baseElement.attr('href', baseElement.attr('href')); } } else { - if (replace) location.replace(url); - else location.href = url; + if (replace) { + location.replace(url); + replacedUrl = url; + } else { + location.href = url; + replacedUrl = null; + } } return self; // getter } else { - // the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 - return location.href.replace(/%27/g,"'"); + // - the replacedUrl is a workaround for an IE8-9 issue with location.replace method that doesn't update + // 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,"'"); } };