aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/service/route.js6
-rw-r--r--test/service/routeSpec.js21
2 files changed, 25 insertions, 2 deletions
diff --git a/src/service/route.js b/src/service/route.js
index c12ce99d..73c73b04 100644
--- a/src/service/route.js
+++ b/src/service/route.js
@@ -235,14 +235,16 @@ angularServiceInject('$route', function($location, $routeParams) {
/////////////////////////////////////////////////////
function switchRouteMatcher(on, when) {
- var regex = '^' + when.replace(/[\.\\\(\)\^\$]/g, "\$1") + '$',
+ // TODO(i): this code is convoluted and inefficient, we should construct the route matching
+ // regex only once and then reuse it
+ var regex = '^' + when.replace(/([\.\\\(\)\^\$])/g, "\\$1") + '$',
params = [],
dst = {};
forEach(when.split(/\W/), function(param) {
if (param) {
var paramRegExp = new RegExp(":" + param + "([\\W])");
if (regex.match(paramRegExp)) {
- regex = regex.replace(paramRegExp, "([^\/]*)$1");
+ regex = regex.replace(paramRegExp, "([^\\/]*)$1");
params.push(param);
}
}
diff --git a/test/service/routeSpec.js b/test/service/routeSpec.js
index 404ff6d5..c8c8cbeb 100644
--- a/test/service/routeSpec.js
+++ b/test/service/routeSpec.js
@@ -59,6 +59,27 @@ describe('$route', function() {
});
+ it('should match a route that contains special chars in the path', function() {
+ $route.when('/$test.23/foo(bar)/:baz', {template: 'test.html'});
+
+ $location.path('/test');
+ scope.$digest();
+ expect($route.current).toBeUndefined();
+
+ $location.path('/$testX23/foo(bar)/222');
+ scope.$digest();
+ expect($route.current).toBeUndefined();
+
+ $location.path('/$test.23/foo(bar)/222');
+ scope.$digest();
+ expect($route.current).toBeDefined();
+
+ $location.path('/$test.23/foo\\(bar)/222');
+ scope.$digest();
+ expect($route.current).toBeUndefined();
+ });
+
+
it('should change route even when only search param changes', function() {
var callback = jasmine.createSpy('onRouteChange');