');
    });
    it('should ignore missformed elements', function(){
      writer.start('d>i&v', {});
      expect(html).toEqual('');
    });
    it('should ignore unknown attributes', function(){
      writer.start('div', {unknown:""});
      expect(html).toEqual('
');
    });
    
    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();
      });
    });
  });
});