import { media } from './media'; import { some } from '../../combinator'; import { input } from '../context'; import { inspect } from '../../debug.test'; describe('Unit: parser/inline/media', () => { describe('media', () => { const parser = some(media); it('xss', () => { assert.deepStrictEqual(inspect(parser, input('![]{javascript:alert}')), [['javascript:alert'], '']); assert.deepStrictEqual(inspect(parser, input('![]{vbscript:alert}')), [['vbscript:alert'], '']); assert.deepStrictEqual(inspect(parser, input('![]{data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K}')), [['data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K'], '']); assert.deepStrictEqual(inspect(parser, input('![]{any:alert}')), [['any:alert'], '']); assert.deepStrictEqual(inspect(parser, input('![]{"}')), [['"'], '']); assert.deepStrictEqual(inspect(parser, input('![]{\\}')), [['\\'], '']); assert.deepStrictEqual(inspect(parser, input('![\\"]{/}')), [['"'], '']); }); it('invalid', () => { assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('{}')), undefined); assert.deepStrictEqual(inspect(parser, input('[]')), undefined); assert.deepStrictEqual(inspect(parser, input('!{}')), undefined); assert.deepStrictEqual(inspect(parser, input('![{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{ }')), [['![]{ }'], '']); assert.deepStrictEqual(inspect(parser, input('![]{ }')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{ }')), undefined); assert.deepStrictEqual(inspect(parser, input('![]]{/}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{{}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{}}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{{}}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{{b}}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{b\nc}')), [['![]{b'], '\nc}']); assert.deepStrictEqual(inspect(parser, input('![]{b\\\nc}')), [['![]{b\\'], '\nc}']); assert.deepStrictEqual(inspect(parser, input('![]{ b}')), [['![]{ b}'], '']); assert.deepStrictEqual(inspect(parser, input('![]{ b\n}')), [['![]{ b'], '\n}']); assert.deepStrictEqual(inspect(parser, input('![ ]{}')), undefined); assert.deepStrictEqual(inspect(parser, input('![ ]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![ ]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![ a]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![ a ]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![\\ a]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![ \\ a]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![\n]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![\\ ]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![\\\n]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![ ]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![&a;]{b}')), [['&a;'], '']); assert.deepStrictEqual(inspect(parser, input('![[]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![a]{}')), undefined); assert.deepStrictEqual(inspect(parser, input('![a\nb]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![a\\\nb]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{ttp://host}')), [['ttp://host'], '']); assert.deepStrictEqual(inspect(parser, input('![]{tel:1234567890}')), [['tel:1234567890'], '']); assert.deepStrictEqual(inspect(parser, input('![]{http://[::ffff:0:0%1]}')), [['http://[::ffff:0:0%1]'], '']); assert.deepStrictEqual(inspect(parser, input('![]{http://[::ffff:0:0/96]}')), [['http://[::ffff:0:0/96]'], '']); assert.deepStrictEqual(inspect(parser, input('![]{.}')), [['.'], '']); assert.deepStrictEqual(inspect(parser, input('![]{..}')), [['..'], '']); assert.deepStrictEqual(inspect(parser, input('![]{../}')), [['../'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/../b}')), [['/../b'], '']); assert.deepStrictEqual(inspect(parser, input(' ![]{b}')), undefined); assert.deepStrictEqual(inspect(parser, input('[]{/}')), undefined); }); it('basic', () => { assert.deepStrictEqual(inspect(parser, input('![]{b}')), [['b'], '']); assert.deepStrictEqual(inspect(parser, input('![]{b }')), [['b'], '']); assert.deepStrictEqual(inspect(parser, input('![]{b }')), [['![]{b'], ' }']); assert.deepStrictEqual(inspect(parser, input('![]{ b }')), [['b'], '']); assert.deepStrictEqual(inspect(parser, input('![]{ b }')), [['![]{ b'], ' }']); assert.deepStrictEqual(inspect(parser, input('![]{ b }')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{ b }')), undefined); assert.deepStrictEqual(inspect(parser, input('![]{"}')), [['"'], '']); assert.deepStrictEqual(inspect(parser, input('![]{"}"}')), [['"'], '"}']); assert.deepStrictEqual(inspect(parser, input('![]{\\}')), [['\\'], '']); assert.deepStrictEqual(inspect(parser, input('![]{\\ }')), [['\\'], '']); assert.deepStrictEqual(inspect(parser, input('![]{\\b}')), [['\\b'], '']); assert.deepStrictEqual(inspect(parser, input('![]{?/../}')), [[`?/../`], '']); assert.deepStrictEqual(inspect(parser, input('![]{#/../}')), [[`#/../`], '']); assert.deepStrictEqual(inspect(parser, input('![]{^/b}')), [[`^/b`], '']); assert.deepStrictEqual(inspect(parser, input('![a ]{b}')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('![a ]{b}')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('![a b]{c}')), [['a b'], '']); assert.deepStrictEqual(inspect(parser, input('![©]{b}')), [['©'], '']); assert.deepStrictEqual(inspect(parser, input('![&copy;]{b}')), [['&copy;'], '']); assert.deepStrictEqual(inspect(parser, input('!{b}')), [['b'], '']); assert.deepStrictEqual(inspect(parser, input('!{ ][ }')), [[']['], '']); assert.deepStrictEqual(inspect(parser, input('!{ }{ }')), [['}{'], '']); }); it('nest', () => { assert.deepStrictEqual(inspect(parser, input('![\\[]{/}')), [['['], '']); assert.deepStrictEqual(inspect(parser, input('![\\"]{"?"#"}')), [['"'], '']); assert.deepStrictEqual(inspect(parser, input('![*a*]{/}')), [['*a*'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/}')), [['<wbr>'], '']); }); it('external', () => { assert.deepStrictEqual(inspect(parser, input('![]{//host}')), [['//host'], '']); assert.deepStrictEqual(inspect(parser, input('![]{//[::]}')), [['//[::]'], '']); }); it('attribute', () => { assert.deepStrictEqual(inspect(parser, input('![]{/ __proto__}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ constructor}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ aspect-ratio}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ nofollow}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ width="4" height="3"}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ 4x3}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ aspect-ratio="4/3"}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ aspect-ratio="4/3" nofollow}')), [['/'], '']); assert.deepStrictEqual(inspect(parser, input('![]{/ 4:3}')), [['/'], '']); }); }); });