diff --git a/bower.json b/bower.json index 4bbd57f..ed2be0c 100644 --- a/bower.json +++ b/bower.json @@ -1,10 +1,11 @@ { - "name": "SpectingularJS", - "version": "0.0.0", - "devDependencies": { - "angular": "~1.2.16", - "angular-mocks": "~1.2.16", - "bootstrap": "~3.1.1", - "jasmine-jquery": "~2.0.3" + "name": "SpectingularJS", + "version": "0.0.0", + "devDependencies": { + "angular": "~1.2.16", + "angular-sanitize": "~1.2.16", + "angular-mocks": "~1.2.16", + "bootstrap": "~3.1.1", + "jasmine-jquery": "~2.0.3" } } \ No newline at end of file diff --git a/config/karma.conf.js b/config/karma.conf.js index c3844d6..623782c 100644 --- a/config/karma.conf.js +++ b/config/karma.conf.js @@ -5,6 +5,7 @@ module.exports = function (config) { files: [ 'bower_components/jquery/dist/jquery.min.js', 'bower_components/angular/angular.min.js', + 'bower_components/angular-sanitize/angular-sanitize.min.js', 'bower_components/angular-mocks/angular-mocks.js', 'src/sp/**/sp.js', 'src/sp/**/*.js', diff --git a/src/sp/utility/spTrusted.js b/src/sp/utility/spTrusted.js new file mode 100644 index 0000000..e514804 --- /dev/null +++ b/src/sp/utility/spTrusted.js @@ -0,0 +1,35 @@ +'use strict'; + +/** + * @ngdoc filter + * @name sp.utility.filter:spTrusted + * + * @description + * Filter for trusting html. + * + * @example + + +
+

trusted

+
+

untrusted

+
+
+
+ + + angular.module('spTrustedExample', ['sp.utility']). + controller('ctrl', function($scope) { + $scope.snippet = '

an html\nhover\nsnippet

'; + }); +
+
+ **/ + +angular.module('sp.utility') + .filter('spTrusted', ['$sce', function ($sce) { + return function (text) { + return $sce.trustAsHtml(text); + }; + }]); \ No newline at end of file diff --git a/test/mocks/sp/i18n/spPropertiesMock.js b/test/mocks/sp/i18n/spPropertiesMock.js index 28bfd6f..b16fa3a 100644 --- a/test/mocks/sp/i18n/spPropertiesMock.js +++ b/test/mocks/sp/i18n/spPropertiesMock.js @@ -1,4 +1,4 @@ -var mocks = { +var spPropertiesMocks = { locales: { enUs: 'en-us', nlNl: 'nl-nl', @@ -29,5 +29,5 @@ var mocks = { }; module.exports = { - mocks: mocks + spPropertiesMocks: spPropertiesMocks }; \ No newline at end of file diff --git a/test/mocks/sp/utility/spTrustedMock.js b/test/mocks/sp/utility/spTrustedMock.js new file mode 100644 index 0000000..30ce681 --- /dev/null +++ b/test/mocks/sp/utility/spTrustedMock.js @@ -0,0 +1,9 @@ +var spTrustedMocks = { + snippet: '

an html\nhover\nsnippet

', + unsafe: 'this.textContent=\'PWN3D!\'', + safe: '' +}; + +module.exports = { + spTrustedMocks: spTrustedMocks +}; \ No newline at end of file diff --git a/test/protractor/sp/i18n/spProperties.html b/test/protractor/sp/i18n/spProperties.html index b30545a..f028ca9 100644 --- a/test/protractor/sp/i18n/spProperties.html +++ b/test/protractor/sp/i18n/spProperties.html @@ -13,17 +13,17 @@ diff --git a/test/protractor/sp/i18n/spPropertiesSpec.js b/test/protractor/sp/i18n/spPropertiesSpec.js index a153018..11c071f 100644 --- a/test/protractor/sp/i18n/spPropertiesSpec.js +++ b/test/protractor/sp/i18n/spPropertiesSpec.js @@ -1,5 +1,5 @@ 'use strict'; -var mocks = require('../../../mocks/sp/i18n/spPropertiesMock').mocks; +var mocks = require('../../../mocks/sp/i18n/spPropertiesMock').spPropertiesMocks; describe('spProperties', function () { beforeEach(function() { diff --git a/test/protractor/sp/utility/spTrusted.html b/test/protractor/sp/utility/spTrusted.html new file mode 100644 index 0000000..a26dbd6 --- /dev/null +++ b/test/protractor/sp/utility/spTrusted.html @@ -0,0 +1,28 @@ + + + + + spTrusted Spec + + + + + + + + + +
+ trusted:
+

+ + untrusted:
+

+
+ + \ No newline at end of file diff --git a/test/protractor/sp/utility/spTrustedSpec.js b/test/protractor/sp/utility/spTrustedSpec.js new file mode 100644 index 0000000..a63ed9f --- /dev/null +++ b/test/protractor/sp/utility/spTrustedSpec.js @@ -0,0 +1,17 @@ +'use strict'; + +var mocks = require('../../../mocks/sp/utility/spTrustedMock').spTrustedMocks; + +describe('spTrusted filter', function () { + beforeEach(function () { + browser.get('/test/protractor/sp/utility/spTrusted.html'); + }); + + it('should trust unsafe html', function () { + expect(element(by.id('trusted')).element(by.tagName('em')).getAttribute('onmouseover')).toEqual(mocks.unsafe); + }); + + it('should not trust unsafe html', function () { + expect(element(by.id('untrusted')).getInnerHtml()).toEqual(mocks.safe); + }); +}); \ No newline at end of file diff --git a/test/unit/sp/i18n/spPropertiesSpec.js b/test/unit/sp/i18n/spPropertiesSpec.js index 06ee016..1e9c40c 100644 --- a/test/unit/sp/i18n/spPropertiesSpec.js +++ b/test/unit/sp/i18n/spPropertiesSpec.js @@ -6,27 +6,27 @@ describe('properties', function () { angular.module("prop1", ['sp.i18n']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier1', mocks.properties.enUs, mocks.locales.enUs); - spPropertiesProvider.add('identifier1', mocks.properties.nlNl, mocks.locales.nlNl); + spPropertiesProvider.add('identifier1', spPropertiesMocks.properties.enUs, spPropertiesMocks.locales.enUs); + spPropertiesProvider.add('identifier1', spPropertiesMocks.properties.nlNl, spPropertiesMocks.locales.nlNl); }); angular.module("prop2", ['sp.i18n']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier2', mocks.properties.de, mocks.locales.de); + spPropertiesProvider.add('identifier2', spPropertiesMocks.properties.de, spPropertiesMocks.locales.de); }); angular.module("prop3", ['sp.i18n']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier3', mocks.properties.enUs, mocks.locales.enUs); - spPropertiesProvider.add('identifier3', mocks.properties.nlNl, mocks.locales.nlNl); - spPropertiesProvider.add('identifier3', mocks.properties.de, mocks.locales.de); + spPropertiesProvider.add('identifier3', spPropertiesMocks.properties.enUs, spPropertiesMocks.locales.enUs); + spPropertiesProvider.add('identifier3', spPropertiesMocks.properties.nlNl, spPropertiesMocks.locales.nlNl); + spPropertiesProvider.add('identifier3', spPropertiesMocks.properties.de, spPropertiesMocks.locales.de); }); angular.module("prop", ['prop1', 'prop2', 'prop3']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier3', {'KEY_0003': mocks.overrides.enUs}, mocks.locales.enUs); - spPropertiesProvider.add('identifier3', {'KEY_0003': mocks.overrides.nlNl}, mocks.locales.nlNl); - spPropertiesProvider.add('identifier3', {'KEY_0003': mocks.overrides.de}, mocks.locales.de); + spPropertiesProvider.add('identifier3', {'KEY_0003': spPropertiesMocks.overrides.enUs}, spPropertiesMocks.locales.enUs); + spPropertiesProvider.add('identifier3', {'KEY_0003': spPropertiesMocks.overrides.nlNl}, spPropertiesMocks.locales.nlNl); + spPropertiesProvider.add('identifier3', {'KEY_0003': spPropertiesMocks.overrides.de}, spPropertiesMocks.locales.de); }); beforeEach(function () { @@ -37,28 +37,28 @@ describe('properties', function () { }); it('should be fetched for the given identifier and locale', function () { - expect(service.properties('identifier1', mocks.locales.enUs)).toEqual(mocks.properties.enUs); - expect(service.properties('identifier1', mocks.locales.nlNl)).toEqual(mocks.properties.nlNl); - expect(service.properties('identifier2', mocks.locales.de)).toEqual(mocks.properties.de); + expect(service.properties('identifier1', spPropertiesMocks.locales.enUs)).toEqual(spPropertiesMocks.properties.enUs); + expect(service.properties('identifier1', spPropertiesMocks.locales.nlNl)).toEqual(spPropertiesMocks.properties.nlNl); + expect(service.properties('identifier2', spPropertiesMocks.locales.de)).toEqual(spPropertiesMocks.properties.de); }); it('should be fetched for the given identifier and locale but not match as they are overridden', function () { - expect(service.properties('identifier3', mocks.locales.enUs)).not.toEqual(mocks.properties.enUs); - expect(service.properties('identifier3', mocks.locales.nlNl)).not.toEqual(mocks.properties.nlNl) - expect(service.properties('identifier3', mocks.locales.de)).not.toEqual(mocks.properties.de) + expect(service.properties('identifier3', spPropertiesMocks.locales.enUs)).not.toEqual(spPropertiesMocks.properties.enUs); + expect(service.properties('identifier3', spPropertiesMocks.locales.nlNl)).not.toEqual(spPropertiesMocks.properties.nlNl) + expect(service.properties('identifier3', spPropertiesMocks.locales.de)).not.toEqual(spPropertiesMocks.properties.de) }); it('should be fetched for the given identifier, key and locale', function () { - expect(service.property('identifier1', 'KEY_0001', mocks.locales.enUs)).toEqual('one'); - expect(service.property('identifier1', 'KEY_0001', mocks.locales.nlNl)).toEqual('één'); - expect(service.property('identifier2', 'KEY_0001', mocks.locales.de)).toEqual('eins'); + expect(service.property('identifier1', 'KEY_0001', spPropertiesMocks.locales.enUs)).toEqual('one'); + expect(service.property('identifier1', 'KEY_0001', spPropertiesMocks.locales.nlNl)).toEqual('één'); + expect(service.property('identifier2', 'KEY_0001', spPropertiesMocks.locales.de)).toEqual('eins'); }); it('should be fetched for the given identifier, key and locale but match the overridden values', function () { - expect(service.property('identifier3', 'KEY_0003', mocks.locales.enUs)).toEqual('override'); - expect(service.property('identifier3', 'KEY_0003', mocks.locales.nlNl)).toEqual('overschrijven'); - expect(service.property('identifier3', 'KEY_0003', mocks.locales.de)).toEqual('überschreiben'); + expect(service.property('identifier3', 'KEY_0003', spPropertiesMocks.locales.enUs)).toEqual('override'); + expect(service.property('identifier3', 'KEY_0003', spPropertiesMocks.locales.nlNl)).toEqual('overschrijven'); + expect(service.property('identifier3', 'KEY_0003', spPropertiesMocks.locales.de)).toEqual('überschreiben'); }); it('should give undefined for undefined entries', function () { - expect(service.property('identifier', 'KEY_0001', mocks.locales.enUs)).toBeUndefined(); - expect(service.property('identifier1', 'KEY', mocks.locales.enUs)).toBeUndefined(); + expect(service.property('identifier', 'KEY_0001', spPropertiesMocks.locales.enUs)).toBeUndefined(); + expect(service.property('identifier1', 'KEY', spPropertiesMocks.locales.enUs)).toBeUndefined(); expect(service.property('identifier1', 'KEY_0001', "--")).toBeUndefined(); }) }); \ No newline at end of file diff --git a/test/unit/sp/utility/spTrustedSpec.js b/test/unit/sp/utility/spTrustedSpec.js new file mode 100644 index 0000000..5d98aa5 --- /dev/null +++ b/test/unit/sp/utility/spTrustedSpec.js @@ -0,0 +1,23 @@ +'use strict'; + +describe('spTrusted filter', function () { + var snippet = '

an html\nhover\nsnippet

'; + var element, scope; + + beforeEach(function() { + module('sp.utility'); + inject(function($rootScope, $compile) { + scope = $rootScope; + element = angular.element( + '
' + ); + scope.snippet = snippet; + $compile(element)(scope); + scope.$digest(); + }) + }); + + it('should trust html', function () { + expect(element.html()).toEqual(snippet); + }); +}); \ No newline at end of file