From e4e617605053528329d6c3ee874e300cd5cb1e4c Mon Sep 17 00:00:00 2001 From: Richard Collins Date: Mon, 24 Feb 2014 11:44:52 +1300 Subject: [PATCH] Potential fix for #6162 --- src/ng/location.js | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/ng/location.js b/src/ng/location.js index a6c3952a9036..d56d5b65c0c5 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -268,6 +268,16 @@ function LocationHashbangInHtml5Url(appBase, hashPrefix) { return appBaseNoFile; } }; + + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#' + this.$$absUrl = appBase + hashPrefix + this.$$url; + }; + } @@ -642,6 +652,35 @@ function $LocationProvider(){ absHref = urlResolve(absHref.animVal).href; } + // Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9) + // The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or somewhere#anchor or http://example.com/somewhere + if (LocationMode === LocationHashbangInHtml5Url) { + // get the actual href attribute - see http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx + // TODO check browser is in standards mode + var href = elm[0].getAttribute('href'); + + if (href.indexOf('://' == -1)) { // Ignore absolute URLs + if (href[0] == '/') { + // absolute path - replace old path + absHref = serverBase(absHref) + href; + } else { + // relative path - join with current path + var stack = $location.path().split("/"), + parts = href.split("/"); + stack.pop(); // remove top file + for (var i=0; i