');
- });
-
- describe('explicitly dissallow', function() {
- it('should not allow attributes', function() {
- writer.start('div', {id:'a', name:'a', style:'a'});
- expect(html).toEqual('
');
- });
-
- it('should not allow tags', function() {
- function tag(name) {
- writer.start(name, {});
- writer.end(name);
- }
- tag('frameset');
- tag('frame');
- tag('form');
- tag('param');
- tag('object');
- tag('embed');
- tag('textarea');
- tag('input');
- tag('button');
- tag('option');
- tag('select');
- tag('script');
- tag('style');
- tag('link');
- tag('base');
- tag('basefont');
- expect(html).toEqual('');
- });
- });
-
- describe('isUri', function() {
-
- function isUri(value) {
- return value.match(URI_REGEXP);
- }
-
- it('should be URI', function() {
- expect(isUri('http://abc')).toBeTruthy();
- expect(isUri('https://abc')).toBeTruthy();
- expect(isUri('ftp://abc')).toBeTruthy();
- expect(isUri('mailto:me@example.com')).toBeTruthy();
- expect(isUri('#anchor')).toBeTruthy();
- });
-
- it('should not be UIR', function() {
- expect(isUri('')).toBeFalsy();
- expect(isUri('javascript:alert')).toBeFalsy();
- });
- });
-
- describe('javascript URL attribute', function() {
- beforeEach(function() {
- this.addMatchers({
- toBeValidUrl: function() {
- return URI_REGEXP.exec(this.actual);
- }
- });
- });
-
- it('should ignore javascript:', function() {
- expect('JavaScript:abc').not.toBeValidUrl();
- expect(' \n Java\n Script:abc').not.toBeValidUrl();
- expect('http://JavaScript/my.js').toBeValidUrl();
- });
-
- it('should ignore dec encoded javascript:', function() {
- expect('javascript:').not.toBeValidUrl();
- expect('javascript:').not.toBeValidUrl();
- expect('j avascript:').not.toBeValidUrl();
- });
-
- it('should ignore decimal with leading 0 encodede javascript:', function() {
- expect('javascript:').not.toBeValidUrl();
- expect('j avascript:').not.toBeValidUrl();
- expect('j avascript:').not.toBeValidUrl();
- });
-
- it('should ignore hex encoded javascript:', function() {
- expect('javascript:').not.toBeValidUrl();
- expect('javascript:').not.toBeValidUrl();
- expect('j avascript:').not.toBeValidUrl();
- });
-
- it('should ignore hex encoded whitespace javascript:', function() {
- expect('jav ascript:alert("A");').not.toBeValidUrl();
- expect('jav
ascript:alert("B");').not.toBeValidUrl();
- expect('jav
ascript:alert("C");').not.toBeValidUrl();
- expect('jav\u0000ascript:alert("D");').not.toBeValidUrl();
- expect('java\u0000\u0000script:alert("D");').not.toBeValidUrl();
- expect(' java\u0000\u0000script:alert("D");').not.toBeValidUrl();
- });
- });
-
- });
-
-});
diff --git a/test/ngSanitize/directive/ngBindHtmlSpec.js b/test/ngSanitize/directive/ngBindHtmlSpec.js
new file mode 100644
index 00000000..be23e5a5
--- /dev/null
+++ b/test/ngSanitize/directive/ngBindHtmlSpec.js
@@ -0,0 +1,25 @@
+describe('ngBindHtml', function() {
+ beforeEach(module('ngSanitize'));
+
+ it('should set html', inject(function($rootScope, $compile) {
+ element = $compile('
')($rootScope);
+ $rootScope.html = '
hello
';
+ $rootScope.$digest();
+ expect(angular.lowercase(element.html())).toEqual('
hello
');
+ }));
+
+
+ it('should reset html when value is null or undefined', inject(function($compile, $rootScope) {
+ element = $compile('
')($rootScope);
+
+ angular.forEach([null, undefined, ''], function(val) {
+ $rootScope.html = 'some val';
+ $rootScope.$digest();
+ expect(angular.lowercase(element.html())).toEqual('some val');
+
+ $rootScope.html = val;
+ $rootScope.$digest();
+ expect(angular.lowercase(element.html())).toEqual('');
+ });
+ }));
+});
diff --git a/test/ngSanitize/filter/linkySpec.js b/test/ngSanitize/filter/linkySpec.js
new file mode 100644
index 00000000..0448159a
--- /dev/null
+++ b/test/ngSanitize/filter/linkySpec.js
@@ -0,0 +1,27 @@
+describe('linky', function() {
+ var linky;
+
+ beforeEach(module('ngSanitize'));
+
+ beforeEach(inject(function($filter){
+ linky = $filter('linky');
+ }));
+
+ it('should do basic filter', function() {
+ expect(linky("http://ab/ (http://a/)
http://1.2/v:~-123. c")).
+ toEqual('
http://ab/ ' +
+ '(
http://a/) ' +
+ '<
http://a/> ' +
+ '
http://1.2/v:~-123. c');
+ expect(linky(undefined)).not.toBeDefined();
+ });
+
+ it('should handle mailto:', function() {
+ expect(linky("mailto:me@example.com")).
+ toEqual('
me@example.com');
+ expect(linky("me@example.com")).
+ toEqual('
me@example.com');
+ expect(linky("send email to me@example.com, but")).
+ toEqual('send email to
me@example.com, but');
+ });
+});
diff --git a/test/ngSanitize/sanitizeSpec.js b/test/ngSanitize/sanitizeSpec.js
new file mode 100644
index 00000000..b4fd8a2a
--- /dev/null
+++ b/test/ngSanitize/sanitizeSpec.js
@@ -0,0 +1,286 @@
+'use strict';
+
+describe('HTML', function() {
+
+ var expectHTML;
+
+ beforeEach(module('ngSanitize'));
+
+ beforeEach(inject(function($sanitize) {
+ expectHTML = function(html){
+ return expect($sanitize(html));
+ };
+ }));
+
+ describe('htmlParser', function() {
+ if (angular.isUndefined(window.htmlParser)) return;
+
+ var handler, start, text;
+ beforeEach(function() {
+ handler = {
+ start: function(tag, attrs, unary){
+ start = {
+ tag: tag,
+ attrs: attrs,
+ unary: unary
+ };
+ // Since different browsers handle newlines differenttly we trim
+ // so that it is easier to write tests.
+ angular.forEach(attrs, function(value, key) {
+ attrs[key] = value.replace(/^\s*/, '').replace(/\s*$/, '')
+ });
+ },
+ chars: function(text_){
+ text = text_;
+ },
+ end:function(tag) {
+ expect(tag).toEqual(start.tag);
+ }
+ };
+ });
+
+ it('should parse basic format', function() {
+ htmlParser('
text', handler);
+ expect(start).toEqual({tag:'tag', attrs:{attr:'value'}, unary:false});
+ expect(text).toEqual('text');
+ });
+
+ it('should parse newlines in tags', function() {
+ htmlParser('<\ntag\n attr="value"\n>text<\n/\ntag\n>', handler);
+ expect(start).toEqual({tag:'tag', attrs:{attr:'value'}, unary:false});
+ expect(text).toEqual('text');
+ });
+
+ it('should parse newlines in attributes', function() {
+ htmlParser('
text', handler);
+ expect(start).toEqual({tag:'tag', attrs:{attr:'value'}, unary:false});
+ expect(text).toEqual('text');
+ });
+
+ it('should parse namespace', function() {
+ htmlParser('
text', handler);
+ expect(start).toEqual({tag:'ns:t-a-g', attrs:{'ns:a-t-t-r':'value'}, unary:false});
+ expect(text).toEqual('text');
+ });
+
+ it('should parse empty value attribute of node', function() {
+ htmlParser('
', handler);
+ expect(start).toEqual({tag:'option', attrs:{selected:'', value:''}, unary:false});
+ expect(text).toEqual('abc');
+ });
+ });
+
+ // THESE TESTS ARE EXECUTED WITH COMPILED ANGULAR
+ it('should echo html', function() {
+ expectHTML('hello
world.').
+ toEqual('hello
world.');
+ });
+
+ it('should remove script', function() {
+ expectHTML('ac.').toEqual('ac.');
+ });
+
+ it('should remove double nested script', function() {
+ expectHTML('ailc.').toEqual('ac.');
+ });
+
+ it('should remove unknown names', function() {
+ expectHTML('a
bc').toEqual('a
bc');
+ });
+
+ it('should remove unsafe value', function() {
+ expectHTML('
').toEqual('');
+ });
+
+ it('should handle self closed elements', function() {
+ expectHTML('a
c').toEqual('a
c');
+ });
+
+ it('should handle namespace', function() {
+ expectHTML('a
bc').toEqual('abc');
+ });
+
+ it('should handle entities', function() {
+ var everything = '
' +
+ '!@#$%^&*()_+-={}[]:";\'<>?,./`~ ħ
';
+ expectHTML(everything).toEqual(everything);
+ });
+
+ it('should handle improper html', function() {
+ expectHTML('< div rel="
');
+ });
+
+ it('should handle improper html2', function() {
+ expectHTML('< div rel="