aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/AngularPublic.js3
-rw-r--r--src/ng/compile.js8
-rw-r--r--src/ng/http.js6
-rw-r--r--src/ng/httpBackend.js3
-rw-r--r--src/ng/location.js56
-rw-r--r--src/ng/sce.js10
-rw-r--r--src/ng/urlUtils.js207
-rw-r--r--test/ng/httpBackendSpec.js16
-rw-r--r--test/ng/locationSpec.js65
-rw-r--r--test/ng/urlUtilsSpec.js24
10 files changed, 152 insertions, 246 deletions
diff --git a/src/AngularPublic.js b/src/AngularPublic.js
index 9bd7fd7d..f7f78ae5 100755
--- a/src/AngularPublic.js
+++ b/src/AngularPublic.js
@@ -127,8 +127,7 @@ function publishExternalAPI(angular){
$sniffer: $SnifferProvider,
$templateCache: $TemplateCacheProvider,
$timeout: $TimeoutProvider,
- $window: $WindowProvider,
- $$urlUtils: $$UrlUtilsProvider
+ $window: $WindowProvider
});
}
]);
diff --git a/src/ng/compile.js b/src/ng/compile.js
index 55de18ec..b52db607 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -276,9 +276,9 @@ function $CompileProvider($provide) {
this.$get = [
'$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',
- '$controller', '$rootScope', '$document', '$sce', '$$urlUtils', '$animate',
+ '$controller', '$rootScope', '$document', '$sce', '$animate',
function($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse,
- $controller, $rootScope, $document, $sce, $$urlUtils, $animate) {
+ $controller, $rootScope, $document, $sce, $animate) {
var Attributes = function(element, attr) {
this.$$element = element;
@@ -370,9 +370,9 @@ function $CompileProvider($provide) {
// sanitize a[href] and img[src] values
if ((nodeName === 'A' && key === 'href') ||
(nodeName === 'IMG' && key === 'src')) {
- // NOTE: $$urlUtils.resolve() doesn't support IE < 8 so we don't sanitize for that case.
+ // NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case.
if (!msie || msie >= 8 ) {
- normalizedVal = $$urlUtils.resolve(value);
+ normalizedVal = urlResolve(value).href;
if (normalizedVal !== '') {
if ((key === 'href' && !normalizedVal.match(aHrefSanitizationWhitelist)) ||
(key === 'src' && !normalizedVal.match(imgSrcSanitizationWhitelist))) {
diff --git a/src/ng/http.js b/src/ng/http.js
index 8fdc0708..de8e6b6d 100644
--- a/src/ng/http.js
+++ b/src/ng/http.js
@@ -132,8 +132,8 @@ function $HttpProvider() {
*/
var responseInterceptorFactories = this.responseInterceptors = [];
- this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector', '$$urlUtils',
- function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector, $$urlUtils) {
+ this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',
+ function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
var defaultCache = $cacheFactory('$http');
@@ -649,7 +649,7 @@ function $HttpProvider() {
config.headers = headers;
config.method = uppercase(config.method);
- var xsrfValue = $$urlUtils.isSameOrigin(config.url)
+ var xsrfValue = urlIsSameOrigin(config.url)
? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
: undefined;
if (xsrfValue) {
diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js
index 3e7406b0..55ea5607 100644
--- a/src/ng/httpBackend.js
+++ b/src/ng/httpBackend.js
@@ -102,8 +102,7 @@ function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument,
}
function completeRequest(callback, status, response, headersString) {
- // URL_MATCH is defined in src/service/location.js
- var protocol = (url.match(SERVER_MATCH) || ['', locationProtocol])[1];
+ var protocol = locationProtocol || urlResolve(url).protocol;
// cancel timeout and subsequent timeout promise resolution
timeoutId && $browserDefer.cancel(timeoutId);
diff --git a/src/ng/location.js b/src/ng/location.js
index 94917cd1..5268bc04 100644
--- a/src/ng/location.js
+++ b/src/ng/location.js
@@ -1,7 +1,6 @@
'use strict';
-var SERVER_MATCH = /^([^:]+):\/\/(\w+:{0,1}\w*@)?(\{?[\w\.-]*\}?)(:([0-9]+))?(\/[^\?#]*)?(\?([^#]*))?(#(.*))?$/,
- PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/,
+var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/,
DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};
var $locationMinErr = minErr('$location');
@@ -23,39 +22,40 @@ function encodePath(path) {
return segments.join('/');
}
-function matchUrl(url, obj) {
- var match = SERVER_MATCH.exec(url);
+function parseAbsoluteUrl(absoluteUrl, locationObj) {
+ var parsedUrl = urlResolve(absoluteUrl);
- obj.$$protocol = match[1];
- obj.$$host = match[3];
- obj.$$port = int(match[5]) || DEFAULT_PORTS[match[1]] || null;
+ locationObj.$$protocol = parsedUrl.protocol;
+ locationObj.$$host = parsedUrl.hostname;
+ locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;
}
-function matchAppUrl(url, obj) {
- var match = PATH_MATCH.exec(url);
- obj.$$path = decodeURIComponent(match[1]);
- obj.$$search = parseKeyValue(match[3]);
- obj.$$hash = decodeURIComponent(match[5] || '');
+function parseAppUrl(relativeUrl, locationObj) {
+ var prefixed = (relativeUrl.charAt(0) !== '/');
+ if (prefixed) {
+ relativeUrl = '/' + relativeUrl;
+ }
+ var match = urlResolve(relativeUrl);
+ locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? match.pathname.substring(1) : match.pathname);
+ locationObj.$$search = parseKeyValue(match.search);
+ locationObj.$$hash = decodeURIComponent(match.hash);
// make sure path starts with '/';
- if (obj.$$path && obj.$$path.charAt(0) != '/') obj.$$path = '/' + obj.$$path;
+ if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') locationObj.$$path = '/' + locationObj.$$path;
}
-function composeProtocolHostPort(protocol, host, port) {
- return protocol + '://' + host + (port == DEFAULT_PORTS[protocol] ? '' : ':' + port);
-}
-
/**
*
* @param {string} begin
* @param {string} whole
- * @param {string} otherwise
- * @returns {string} returns text from whole after begin or otherwise if it does not begin with expected string.
+ * @returns {string} returns text from whole after begin or undefined if it does not begin with expected string.
*/
-function beginsWith(begin, whole, otherwise) {
- return whole.indexOf(begin) == 0 ? whole.substr(begin.length) : otherwise;
+function beginsWith(begin, whole) {
+ if (whole.indexOf(begin) == 0) {
+ return whole.substr(begin.length);
+ }
}
@@ -87,20 +87,22 @@ function LocationHtml5Url(appBase, basePrefix) {
this.$$html5 = true;
basePrefix = basePrefix || '';
var appBaseNoFile = stripFile(appBase);
+ parseAbsoluteUrl(appBase, this);
+
+
/**
* Parse given html5 (regular) url string into properties
* @param {string} newAbsoluteUrl HTML5 url
* @private
*/
this.$$parse = function(url) {
- var parsed = {}
- matchUrl(url, parsed);
var pathUrl = beginsWith(appBaseNoFile, url);
if (!isString(pathUrl)) {
throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, appBaseNoFile);
}
- matchAppUrl(pathUrl, parsed);
- extend(this, parsed);
+
+ parseAppUrl(pathUrl, this);
+
if (!this.$$path) {
this.$$path = '/';
}
@@ -151,7 +153,7 @@ function LocationHtml5Url(appBase, basePrefix) {
function LocationHashbangUrl(appBase, hashPrefix) {
var appBaseNoFile = stripFile(appBase);
- matchUrl(appBase, this);
+ parseAbsoluteUrl(appBase, this);
/**
@@ -170,7 +172,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
if (!isString(withoutHashUrl)) {
throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url, hashPrefix);
}
- matchAppUrl(withoutHashUrl, this);
+ parseAppUrl(withoutHashUrl, this);
this.$$compose();
};
diff --git a/src/ng/sce.js b/src/ng/sce.js
index 7a40fbc9..683081c9 100644
--- a/src/ng/sce.js
+++ b/src/ng/sce.js
@@ -123,7 +123,7 @@ function adjustMatchers(matchers) {
* // The blacklist overrides the whitelist so the open redirect here is blocked.
* $sceDelegateProvider.resourceUrlBlacklist([
* 'http://myapp.example.com/clickThru**']);
- * });
+ * });
* </pre>
*/
@@ -199,8 +199,8 @@ function $SceDelegateProvider() {
return resourceUrlBlacklist;
};
- this.$get = ['$log', '$document', '$injector', '$$urlUtils', function(
- $log, $document, $injector, $$urlUtils) {
+ this.$get = ['$log', '$document', '$injector', function(
+ $log, $document, $injector) {
var htmlSanitizer = function htmlSanitizer(html) {
throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
@@ -213,7 +213,7 @@ function $SceDelegateProvider() {
function matchUrl(matcher, parsedUrl) {
if (matcher === 'self') {
- return $$urlUtils.isSameOrigin(parsedUrl);
+ return urlIsSameOrigin(parsedUrl);
} else {
// definitely a regex. See adjustMatchers()
return !!matcher.exec(parsedUrl.href);
@@ -221,7 +221,7 @@ function $SceDelegateProvider() {
}
function isResourceUrlAllowedByPolicy(url) {
- var parsedUrl = $$urlUtils.resolve(url.toString(), true);
+ var parsedUrl = urlResolve(url.toString());
var i, n, allowed = false;
// Ensure that at least one item from the whitelist allows this url.
for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {
diff --git a/src/ng/urlUtils.js b/src/ng/urlUtils.js
index f1e31d7a..50156e6b 100644
--- a/src/ng/urlUtils.js
+++ b/src/ng/urlUtils.js
@@ -1,119 +1,100 @@
'use strict';
+// NOTE: The usage of window and document instead of $window and $document here is
+// deliberate. This service depends on the specific behavior of anchor nodes created by the
+// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and
+// cause us to break tests. In addition, when the browser resolves a URL for XHR, it
+// doesn't know about mocked locations and resolves URLs to the real document - which is
+// exactly the behavior needed here. There is little value is mocking these out for this
+// service.
+var urlParsingNode = document.createElement("a");
+var originUrl = urlResolve(window.location.href, true);
-function $$UrlUtilsProvider() {
- this.$get = [function() {
- var urlParsingNode = document.createElement("a"),
- // NOTE: The usage of window and document instead of $window and $document here is
- // deliberate. This service depends on the specific behavior of anchor nodes created by the
- // browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and
- // cause us to break tests. In addition, when the browser resolves a URL for XHR, it
- // doesn't know about mocked locations and resolves URLs to the real document - which is
- // exactly the behavior needed here. There is little value is mocking these our for this
- // service.
- originUrl = resolve(window.location.href, true);
+/**
+ *
+ * Implementation Notes for non-IE browsers
+ * ----------------------------------------
+ * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,
+ * results both in the normalizing and parsing of the URL. Normalizing means that a relative
+ * URL will be resolved into an absolute URL in the context of the application document.
+ * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related
+ * properties are all populated to reflect the normalized URL. This approach has wide
+ * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See
+ * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
+ *
+ * Implementation Notes for IE
+ * ---------------------------
+ * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other
+ * browsers. However, the parsed components will not be set if the URL assigned did not specify
+ * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We
+ * work around that by performing the parsing in a 2nd step by taking a previously normalized
+ * URL (e.g. by assining to a.href) and assigning it a.href again. This correctly populates the
+ * properties such as protocol, hostname, port, etc.
+ *
+ * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one
+ * uses the inner HTML approach to assign the URL as part of an HTML snippet -
+ * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL.
+ * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception.
+ * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that
+ * method and IE < 8 is unsupported.
+ *
+ * References:
+ * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
+ * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
+ * http://url.spec.whatwg.org/#urlutils
+ * https://github.com/angular/angular.js/pull/2902
+ * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
+ *
+ * @function
+ * @param {string} url The URL to be parsed.
+ * @description Normalizes and parses a URL.
+ * @returns {object} Returns the normalized URL as a dictionary.
+ *
+ * | member name | Description |
+ * |---------------|----------------|
+ * | href | A normalized version of the provided URL if it was not an absolute URL |
+ * | protocol | The protocol including the trailing colon |
+ * | host | The host and port (if the port is non-default) of the normalizedUrl |
+ * | search | The search params, minus the question mark |
+ * | hash | The hash string, minus the hash symbol
+ * | hostname | The hostname
+ * | port | The port, without ":"
+ * | pathname | The pathname, beginning with "/"
+ *
+ */
+function urlResolve(url) {
+ var href = url;
+ if (msie) {
+ // Normalize before parse. Refer Implementation Notes on why this is
+ // done in two steps on IE.
+ urlParsingNode.setAttribute("href", href);
+ href = urlParsingNode.href;
+ }
- /**
- * @description
- * Normalizes and optionally parses a URL.
- *
- * NOTE: This is a private service. The API is subject to change unpredictably in any commit.
- *
- * Implementation Notes for non-IE browsers
- * ----------------------------------------
- * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,
- * results both in the normalizing and parsing of the URL. Normalizing means that a relative
- * URL will be resolved into an absolute URL in the context of the application document.
- * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related
- * properties are all populated to reflect the normalized URL. This approach has wide
- * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See
- * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
- *
- * Implementation Notes for IE
- * ---------------------------
- * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other
- * browsers. However, the parsed components will not be set if the URL assigned did not specify
- * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We
- * work around that by performing the parsing in a 2nd step by taking a previously normalized
- * URL (e.g. by assining to a.href) and assigning it a.href again. This correctly populates the
- * properties such as protocol, hostname, port, etc.
- *
- * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one
- * uses the inner HTML approach to assign the URL as part of an HTML snippet -
- * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL.
- * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception.
- * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that
- * method and IE < 8 is unsupported.
- *
- * References:
- * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
- * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
- * http://url.spec.whatwg.org/#urlutils
- * https://github.com/angular/angular.js/pull/2902
- * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
- *
- * @param {string} url The URL to be parsed.
- * @param {boolean=} parse When true, returns an object for the parsed URL. Otherwise, returns
- * a single string that is the normalized URL.
- * @returns {object|string} When parse is true, returns the normalized URL as a string.
- * Otherwise, returns an object with the following members.
- *
- * | member name | Description |
- * |---------------|----------------|
- * | href | A normalized version of the provided URL if it was not an absolute URL |
- * | protocol | The protocol including the trailing colon |
- * | host | The host and port (if the port is non-default) of the normalizedUrl |
- *
- * These fields from the UrlUtils interface are currently not needed and hence not returned.
- *
- * | member name | Description |
- * |---------------|----------------|
- * | hostname | The host without the port of the normalizedUrl |
- * | pathname | The path following the host in the normalizedUrl |
- * | hash | The URL hash if present |
- * | search | The query string |
- *
- */
- function resolve(url, parse) {
- var href = url;
- if (msie <= 11) {
- // Normalize before parse. Refer Implementation Notes on why this is
- // done in two steps on IE.
- urlParsingNode.setAttribute("href", href);
- href = urlParsingNode.href;
- }
- urlParsingNode.setAttribute('href', href);
+ urlParsingNode.setAttribute('href', href);
+
+ // $$urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: urlParsingNode.pathname && urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname
+ };
+}
- if (!parse) {
- return urlParsingNode.href;
- }
- // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
- return {
- href: urlParsingNode.href,
- protocol: urlParsingNode.protocol,
- host: urlParsingNode.host
- // Currently unused and hence commented out.
- // hostname: urlParsingNode.hostname,
- // port: urlParsingNode.port,
- // pathname: urlParsingNode.pathname,
- // hash: urlParsingNode.hash,
- // search: urlParsingNode.search
- };
- }
- return {
- resolve: resolve,
- /**
- * Parse a request URL and determine whether this is a same-origin request as the application document.
- *
- * @param {string|object} requestUrl The url of the request as a string that will be resolved
- * or a parsed URL object.
- * @returns {boolean} Whether the request is for the same origin as the application document.
- */
- isSameOrigin: function isSameOrigin(requestUrl) {
- var parsed = (typeof requestUrl === 'string') ? resolve(requestUrl, true) : requestUrl;
- return (parsed.protocol === originUrl.protocol &&
- parsed.host === originUrl.host);
- }
- };
- }];
+/**
+ * Parse a request URL and determine whether this is a same-origin request as the application document.
+ *
+ * @param {string|object} requestUrl The url of the request as a string that will be resolved
+ * or a parsed URL object.
+ * @returns {boolean} Whether the request is for the same origin as the application document.
+ */
+function urlIsSameOrigin(requestUrl) {
+ var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;
+ return (parsed.protocol === originUrl.protocol &&
+ parsed.host === originUrl.host);
}
diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js
index faec5737..f39e83ea 100644
--- a/test/ng/httpBackendSpec.js
+++ b/test/ng/httpBackendSpec.js
@@ -363,7 +363,7 @@ describe('$httpBackend', function() {
it('should convert 0 to 200 if content', function() {
- $backend = createHttpBackend($browser, MockXhr, null, null, null, 'http');
+ $backend = createHttpBackend($browser, MockXhr);
$backend('GET', 'file:///whatever/index.html', null, callback);
respond(0, 'SOME CONTENT');
@@ -373,19 +373,8 @@ describe('$httpBackend', function() {
});
- it('should convert 0 to 200 if content - relative url', function() {
- $backend = createHttpBackend($browser, MockXhr, null, null, null, 'file');
-
- $backend('GET', '/whatever/index.html', null, callback);
- respond(0, 'SOME CONTENT');
-
- expect(callback).toHaveBeenCalled();
- expect(callback.mostRecentCall.args[0]).toBe(200);
- });
-
-
it('should convert 0 to 404 if no content', function() {
- $backend = createHttpBackend($browser, MockXhr, null, null, null, 'http');
+ $backend = createHttpBackend($browser, MockXhr);
$backend('GET', 'file:///whatever/index.html', null, callback);
respond(0, '');
@@ -404,7 +393,6 @@ describe('$httpBackend', function() {
expect(callback).toHaveBeenCalled();
expect(callback.mostRecentCall.args[0]).toBe(404);
});
-
});
});
diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js
index a60f1609..30f2f81a 100644
--- a/test/ng/locationSpec.js
+++ b/test/ng/locationSpec.js
@@ -695,69 +695,6 @@ describe('$location', function() {
});
});
-
- describe('SERVER_MATCH', function() {
-
- it('should parse basic url', function() {
- var match = SERVER_MATCH.exec('http://www.angularjs.org/path?search#hash?x=x');
-
- expect(match[1]).toBe('http');
- expect(match[3]).toBe('www.angularjs.org');
- });
-
-
- it('should parse file://', function() {
- var match = SERVER_MATCH.exec('file:///Users/Shared/misko/work/angular.js/scenario/widgets.html');
-
- expect(match[1]).toBe('file');
- expect(match[3]).toBe('');
- expect(match[5]).toBeFalsy();
- });
-
-
- it('should parse url with "-" in host', function() {
- var match = SERVER_MATCH.exec('http://a-b1.c-d.09/path');
-
- expect(match[1]).toBe('http');
- expect(match[3]).toBe('a-b1.c-d.09');
- expect(match[5]).toBeFalsy();
- });
-
-
- it('should parse host without "/" at the end', function() {
- var match = SERVER_MATCH.exec('http://host.org');
- expect(match[3]).toBe('host.org');
-
- match = SERVER_MATCH.exec('http://host.org#');
- expect(match[3]).toBe('host.org');
-
- match = SERVER_MATCH.exec('http://host.org?');
- expect(match[3]).toBe('host.org');
- });
-
-
- it('should parse chrome extension urls', function() {
- var match = SERVER_MATCH.exec('chrome-extension://jjcldkdmokihdaomalanmlohibnoplog/index.html?foo#bar');
-
- expect(match[1]).toBe('chrome-extension');
- expect(match[3]).toBe('jjcldkdmokihdaomalanmlohibnoplog');
- });
-
- it('should parse FFOS app:// urls', function() {
- var match = SERVER_MATCH.exec('app://{d0419af1-8b42-41c5-96f4-ef4179e52315}/path');
-
- expect(match[1]).toBe('app');
- expect(match[3]).toBe('{d0419af1-8b42-41c5-96f4-ef4179e52315}');
- expect(match[5]).toBeFalsy();
- expect(match[6]).toBe('/path');
- expect(match[8]).toBeFalsy();
-
- match = SERVER_MATCH.exec('app://}foo{')
- expect(match).toBe(null);
- });
- });
-
-
describe('PATH_MATCH', function() {
it('should parse just path', function() {
@@ -1327,7 +1264,7 @@ describe('$location', function() {
);
- it('should listen on click events on href and prevent browser default in hashbang mode', function() {
+ it('should listen on click events on href and prevent browser default in hashbang mode', function() {
module(function() {
return function($rootElement, $compile, $rootScope) {
$rootElement.html('<a href="http://server/#/somePath">link</a>');
diff --git a/test/ng/urlUtilsSpec.js b/test/ng/urlUtilsSpec.js
index 3c9bf847..18675ed8 100644
--- a/test/ng/urlUtilsSpec.js
+++ b/test/ng/urlUtilsSpec.js
@@ -1,29 +1,29 @@
'use strict';
-describe('$$urlUtils', function() {
+describe('urlUtils', function() {
describe('parse', function() {
- it('should normalize a relative url', inject(function($$urlUtils) {
- expect($$urlUtils.resolve("foo")).toMatch(/^https?:\/\/[^/]+\/foo$/);
- }));
+ it('should normalize a relative url', function () {
+ expect(urlResolve("foo").href).toMatch(/^https?:\/\/[^/]+\/foo$/);
+ });
- it('should parse relative URL into component pieces', inject(function($$urlUtils) {
- var parsed = $$urlUtils.resolve("foo", true);
+ it('should parse relative URL into component pieces', function () {
+ var parsed = urlResolve("foo");
expect(parsed.href).toMatch(/https?:\/\//);
- expect(parsed.protocol).toMatch(/^https?:/);
+ expect(parsed.protocol).toMatch(/^https?/);
expect(parsed.host).not.toBe("");
expect(parsed.hostname).not.toBe("");
expect(parsed.pathname).not.toBe("");
- }));
+ });
});
describe('isSameOrigin', function() {
- it('should support various combinations of urls - both string and parsed', inject(function($$urlUtils, $document) {
+ it('should support various combinations of urls - both string and parsed', inject(function($document) {
function expectIsSameOrigin(url, expectedValue) {
- expect($$urlUtils.isSameOrigin(url)).toBe(expectedValue);
- expect($$urlUtils.isSameOrigin($$urlUtils.resolve(url, true))).toBe(expectedValue);
+ expect(urlIsSameOrigin(url)).toBe(expectedValue);
+ expect(urlIsSameOrigin(urlResolve(url, true))).toBe(expectedValue);
}
expectIsSameOrigin('path', true);
- var origin = $$urlUtils.resolve($document[0].location.href, true);
+ var origin = urlResolve($document[0].location.href, true);
expectIsSameOrigin('//' + origin.host + '/path', true);
// Different domain.
expectIsSameOrigin('http://example.com/path', false);