aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaitlin Potter2013-12-18 17:12:02 -0500
committerIgor Minar2013-12-18 17:16:39 -0800
commitbc3ff2cecd0861766a9e8606f3cc2c582d9875df (patch)
tree4155ddfca3e881c59463d763e13f4607098557f1
parent8f329ffb829410e1fd8f86a766929134e736e3e5 (diff)
downloadangular.js-bc3ff2cecd0861766a9e8606f3cc2c582d9875df.tar.bz2
fix($location): parse xlink:href for SVGAElements
Before this fix, the xlink:href property of an SVG <a> element could not be parsed on click, as the property is an SVGAnimatedString rather than a DOMString. This patch parses the xlink:href's animVal into a DOMString in order to prevent an `Object #<SVGAnimatedString> has no method 'indexOf'` exception from being thrown, and also to update the location if necessary as expected. Closes #5472 Closes #5198 Closes #5199 Closes #4098 Closes #1420
-rw-r--r--src/ng/location.js7
-rw-r--r--test/ng/locationSpec.js25
2 files changed, 32 insertions, 0 deletions
diff --git a/src/ng/location.js b/src/ng/location.js
index 402db3cf..12f6c14c 100644
--- a/src/ng/location.js
+++ b/src/ng/location.js
@@ -629,6 +629,13 @@ function $LocationProvider(){
}
var absHref = elm.prop('href');
+
+ if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {
+ // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during
+ // an animation.
+ absHref = urlResolve(absHref.animVal).href;
+ }
+
var rewrittenUrl = $location.$$rewrite(absHref);
if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {
diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js
index b9dd17fa..f23965f8 100644
--- a/test/ng/locationSpec.js
+++ b/test/ng/locationSpec.js
@@ -1229,6 +1229,31 @@ describe('$location', function() {
});
browserTrigger(button, 'click');
}));
+
+
+ it('should not throw when clicking an SVGAElement link', function() {
+ var base;
+ module(function($locationProvider) {
+ return function($browser) {
+ window.location.hash = '!someHash';
+ $browser.url(base = window.location.href);
+ base = base.split('#')[0];
+ $locationProvider.hashPrefix('!');
+ }
+ });
+ inject(function($rootScope, $compile, $browser, $rootElement, $document, $location) {
+ // we need to do this otherwise we can't simulate events
+ $document.find('body').append($rootElement);
+ var template = '<svg><g><a xlink:href="#!/view1"><circle r="50"></circle></a></g></svg>';
+ var element = $compile(template)($rootScope);
+
+ $rootElement.append(element);
+ var av1 = $rootElement.find('a').eq(0);
+ expect(function() {
+ browserTrigger(av1, 'click');
+ }).not.toThrow();
+ });
+ });
});