From f7a5f1788a794d082a05e48f728b22b47a6cc622 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Wed, 21 Sep 2011 13:47:17 +0200 Subject: fix($route): fix regex escaping in route matcher --- src/service/route.js | 6 ++++-- test/service/routeSpec.js | 27 +++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/service/route.js b/src/service/route.js index 2634eb6c..9f0c7b6d 100644 --- a/src/service/route.js +++ b/src/service/route.js @@ -197,14 +197,16 @@ angularServiceInject('$route', function(location, $updateView) { function switchRouteMatcher(on, when, dstName) { - 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 4d24279c..7422ab56 100644 --- a/test/service/routeSpec.js +++ b/test/service/routeSpec.js @@ -55,14 +55,37 @@ describe('$route', function() { it('should return fn registered with onChange()', function() { - var scope = angular.scope(), - $route = scope.$service('$route'), + var $route = scope.$service('$route'), fn = function() {}; expect($route.onChange(fn)).toBe(fn); }); + it('should match a route that contains special chars in the path', function() { + var $route = scope.$service('$route'), + $location = scope.$service('$location'); + + $route.when('/$test.23/foo(bar)/:baz', {template: 'test.html'}); + + $location.hashPath = '/test'; + scope.$eval(); + expect($route.current).toBe(null); + + $location.hashPath = '/$testX23/foo(bar)/222'; + scope.$eval(); + expect($route.current).toBe(null); + + $location.hashPath = '/$test.23/foo(bar)/222'; + scope.$eval(); + expect($route.current).toBeDefined(); + + $location.hashPath = '/$test.23/foo\\(bar)/222'; + scope.$eval(); + expect($route.current).toBe(null); + }); + + it('should allow routes to be defined with just templates without controllers', function() { var scope = angular.scope(), $location = scope.$service('$location'), -- cgit v1.2.3