From 8a6cc07c3d47d902b408e16276ee1171aaaa2599 Mon Sep 17 00:00:00 2001 From: knalli Date: Tue, 15 Sep 2015 17:51:54 +0200 Subject: [PATCH] feat(sanitize): Allow sanitize strategy defined as a service This change allows to define a strategy like this one: ```js app config(function($translateProvider, $translateSanitizationProvider) { $translateSanitizationProvider.addStrategy('myStrategy', 'myStrategyService'); $translateProvider.useSanitizeValueStrategy('myStrategy'); }) .factory('myStrategyService', function ($sce) { return function (value, mode) { if (mode === 'text') { return 'something in text mode'; } return 'something in params mode''; }; }) ``` --- src/service/sanitization.js | 12 +++++++++++ test/unit/service/sanitization.spec.js | 29 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/service/sanitization.js b/src/service/sanitization.js index ce83c5788..9cedb0188 100644 --- a/src/service/sanitization.js +++ b/src/service/sanitization.js @@ -140,12 +140,24 @@ function $translateSanitizationProvider () { */ this.$get = function ($injector, $log) { + var cachedStrategyMap = {}; + var applyStrategies = function (value, mode, selectedStrategies) { angular.forEach(selectedStrategies, function (selectedStrategy) { if (angular.isFunction(selectedStrategy)) { value = selectedStrategy(value, mode); } else if (angular.isFunction(strategies[selectedStrategy])) { value = strategies[selectedStrategy](value, mode); + } else if (angular.isString(strategies[selectedStrategy])) { + if (!cachedStrategyMap[strategies[selectedStrategy]]) { + try { + cachedStrategyMap[strategies[selectedStrategy]] = $injector.get(strategies[selectedStrategy]); + } catch (e) { + cachedStrategyMap[strategies[selectedStrategy]] = function() {}; + throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \'' + selectedStrategy + '\''); + } + } + value = cachedStrategyMap[strategies[selectedStrategy]](value, mode); } else { throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \'' + selectedStrategy + '\''); } diff --git a/test/unit/service/sanitization.spec.js b/test/unit/service/sanitization.spec.js index 3d1e7e46c..37b28fd14 100644 --- a/test/unit/service/sanitization.spec.js +++ b/test/unit/service/sanitization.spec.js @@ -190,6 +190,35 @@ describe('pascalprecht.translate', function () { }); }); + describe('$translateSanitization', function () { + var $translateSanitization; + + beforeEach(module('ngSanitize')); + beforeEach(module('pascalprecht.translate', function ($provide, $translateSanitizationProvider) { + $provide.factory('mySanitizeService', function () { + return function (value, mode) { + return '1' + value + '2' + mode; + }; + }); + $translateSanitizationProvider.addStrategy('mySanitize', 'mySanitizeService'); + $translateSanitizationProvider.useStrategy('mySanitize'); + })); + beforeEach(inject(function (_$translateSanitization_) { + $translateSanitization = _$translateSanitization_; + })); + + describe('should allow specifying a different strategy which is the alias of an existing service', function () { + it('for text', function () { + expect($translateSanitization.sanitize('Donald Duck', 'text')).toEqual('1Donald Duck2text'); + }); + + it('for params', function () { + expect($translateSanitization.sanitize('Donald Duck', 'params')).toEqual('1Donald Duck2params'); + }); + }); + + }); + describe('$translateSanitization#sanitize without ngSanitize', function () { var $translateSanitization;