diff --git a/src/service/route.js b/src/service/route.js index c12ce99df626..73c73b04f1b2 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 404ff6d54144..c8c8cbeb5bb0 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');