From 45bf5e9b1a3032b335583394aa572b4906d7cc2b Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Mon, 26 Mar 2018 17:30:59 +0300 Subject: [PATCH] refactor(urlResolve): return already parsed URLs unchanged --- src/ng/urlUtils.js | 11 +++++++---- test/ng/urlUtilsSpec.js | 9 +++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ng/urlUtils.js b/src/ng/urlUtils.js index d5bb9a1a222b..149e14c707b3 100644 --- a/src/ng/urlUtils.js +++ b/src/ng/urlUtils.js @@ -40,7 +40,8 @@ var baseUrlParsingNode; * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ * * @kind function - * @param {string} url The URL to be parsed. + * @param {string|object} url The URL to be parsed. If `url` is not a string, it will be returned + * unchanged. * @description Normalizes and parses a URL. * @returns {object} Returns the normalized URL as a dictionary. * @@ -57,6 +58,8 @@ var baseUrlParsingNode; * */ function urlResolve(url) { + if (!isString(url)) return url; + var href = url; // Support: IE 9-11 only @@ -132,7 +135,7 @@ function urlIsAllowedOriginFactory(whitelistedOriginUrls) { * @returns {boolean} - Whether the specified URL is of an allowed origin. */ return function urlIsAllowedOrigin(requestUrl) { - var parsedUrl = isString(requestUrl) ? urlResolve(requestUrl) : requestUrl; + var parsedUrl = urlResolve(requestUrl); return parsedAllowedOriginUrls.some(urlsAreSameOrigin.bind(null, parsedUrl)); }; } @@ -148,8 +151,8 @@ function urlIsAllowedOriginFactory(whitelistedOriginUrls) { * @returns {boolean} - True if both URLs have the same origin, and false otherwise. */ function urlsAreSameOrigin(url1, url2) { - url1 = isString(url1) ? urlResolve(url1) : url1; - url2 = isString(url2) ? urlResolve(url2) : url2; + url1 = urlResolve(url1); + url2 = urlResolve(url2); return (url1.protocol === url2.protocol && url1.host === url2.host); diff --git a/test/ng/urlUtilsSpec.js b/test/ng/urlUtilsSpec.js index 934bf8ef34e9..ebd864076623 100644 --- a/test/ng/urlUtilsSpec.js +++ b/test/ng/urlUtilsSpec.js @@ -2,6 +2,15 @@ describe('urlUtils', function() { describe('urlResolve', function() { + it('should returned already parsed URLs unchanged', function() { + var urlObj = urlResolve('/foo?bar=baz#qux'); + expect(urlResolve(urlObj)).toBe(urlObj); + expect(urlResolve(true)).toBe(true); + expect(urlResolve(null)).toBeNull(); + expect(urlResolve(undefined)).toBeUndefined(); + }); + + it('should normalize a relative url', function() { expect(urlResolve('foo').href).toMatch(/^https?:\/\/[^/]+\/foo$/); });